2014-04-09 13 views
10

Tôi đang xây dựng một ứng dụng Android cần tiện ích giao diện người dùng "Thẻ bài".Loại bố cục Android StackView có Vuốt ngang

Đây là một yêu cầu cho một ví dụ hoạt động/bố trí có thể làm như sau:

1) Dọc Swipe Hỗ trợ:

Danh sách một cỗ bài có thể được cuộn theo chiều dọc/swiped. StackView thực hiện điều này, nhưng tôi mở cửa cho bất kỳ giải pháp hoạt động tốt (ví dụ, một số dự án CardUI)

2) ngang Swipe Hỗ trợ:

Đối với bất kỳ thẻ, có 2 định nghĩa từ điển:

  • Nếu chúng ta làm một swipe trái - sau đó chúng ta có thể xem định nghĩa A.
  • Nếu chúng ta làm cách vuốt sang phải, chúng ta thấy nét B
  • swipe ngang cập nhật không cập nhật toàn bộ bố trí màn hình, chỉ cần thẻ đã bị quét. Vì vậy, nếu tôi vuốt Card2 ở bên phải để xem A2, tôi vẫn còn có Card1 đằng sau A2

Ví dụ:

[A1][Card1][B1] 
[A2][Card2][B2] 
[A3][Card3][B3] 

tôi đã thấy điều này liên quan post here, câu trả lời có cung cấp một số gợi ý và thông tin tham khảo .. nhưng không may, tôi vẫn đang cố gắng tìm ra.

Trả lời

8

Bạn có hai cách tiếp cận có thể: thực hiện một số dự án mã nguồn mở và điều chỉnh nó theo nhu cầu của bạn, hoặc bằng cách khác, hãy vuốt thẻ của bạn dưới dạng thanh trượt hình ảnh từ hướng dẫn chi tiết.

Đối với tùy chọn đầu tiên, hãy xem trong Github, nơi bạn sẽ tìm thấy một số dự án nhỏ làm bài với features thường trên cuộn dọc hoặc ngang. Tôi đoán bạn có thể tìm thấy thú vị các dự án sau:

  • CardDeck: Deck of Cards dành cho Android

  • DeckPicker: Một android Anki dự án hoàn thành droid với một số tính năng bổ sung của thẻ Preview trong màn hình trình duyệt. Trong thẻ màn hình Xem trước sẽ được hiển thị như chế độ xem lại trên cửa sổ card browser.

Cuối cùng nếu các thay đổi bổ sung bạn thực hiện có vẻ tốt đẹp, bạn có thể gửi bản vá cho dự án gốc.

Để thay thế thứ hai, đối với trường hợp bạn muốn triển khai từ đầu, sau đó thực hiện các bước đơn giản, phát triển dự án của bạn thành chi tiết cụ thể/phức tạp hơn tùy chỉnh nó theo ý muốn của bạn.Một hình ảnh thanh trượt độ toàn màn hình sẽ phù hợp với những hóa đơn, trong đó sẽ bao gồm các hoạt động cho trang xem:

activity_fullscreen_view.xml 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</LinearLayout> 

Và một Java class với một người xem toàn màn hình:

public class FullScreenImageAdapter extends PagerAdapter { 

    private Activity _activity; 
    private ArrayList<String> _imagePaths; 
    private LayoutInflater inflater; 

    // constructor 
    public FullScreenImageAdapter(Activity activity, 
      ArrayList<String> imagePaths) { 
     this._activity = activity; 
     this._imagePaths = imagePaths; 
    } 

    @Override 
    public int getCount() { 
     return this._imagePaths.size(); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == ((RelativeLayout) object); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     ImageView imgDisplay; 
     Button btnClose; 

     inflater = (LayoutInflater) _activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container, 
       false); 

     imgDisplay = (ImageView) viewLayout.findViewById(R.id.imgDisplay); 
     btnClose = (Button) viewLayout.findViewById(R.id.btnClose); 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     Bitmap bitmap = BitmapFactory.decodeFile(_imagePaths.get(position), options); 
     imgDisplay.setImageBitmap(bitmap); 

     // close button click event 
     btnClose.setOnClickListener(new View.OnClickListener() {   
      @Override 
      public void onClick(View v) { 
       _activity.finish(); 
      } 
     }); 

     ((ViewPager) container).addView(viewLayout); 

     return viewLayout; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     ((ViewPager) container).removeView((RelativeLayout) object); 

    } 
} 

Sau đó, bạn đạt được hình ảnh trượt horizontally, chẳng hạn như: enter image description here

Và để thêm chuyển động thẳng đứng, chỉ bao gồm thêm bố trí dọc:

main.xml 

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

    android:layout_width="fill_parent" 

    android:layout_height="fill_parent" 

    android:orientation="vertical" > 

    <TextView 

     android:layout_width="fill_parent" 

     android:layout_height="wrap_content" 

     android:text="Swipe Demo" 

     android:gravity="center" 

     android:layout_margin="10dip" /> 

     <LinearLayout 

      android:layout_width="fill_parent" 

      android:layout_height="fill_parent" 

      android:orientation="vertical" 

      android:gravity="center"> 

       <ImageView 

        android:layout_width="wrap_content" 

        android:layout_height="wrap_content" 

        android:layout_gravity="center" 

        android:gravity="center" 

        android:layout_margin="10dip" 

        android:id="@+id/image_place_holder"/> 

      </LinearLayout> 

</LinearLayout> 

nào sẽ cho phép bạn trượt điều vertically:

enter image description here

Vào cuối ngày, những gì bạn muốn có là một mạng lưới, chẳng hạn như di chuyển dọc và ngang nhau. Cho rằng bạn phải kết hợp cả hai chiều dọc và ngang trượt vào một table layout:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"> 

    <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="wrap_content" 
        android:layout_height="fill_parent"> 

     <TableLayout 
        android:id="@+id/amortization" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"> 

       <TableRow 
        android:background="#ffff00"> 
        <TextView 
         android:text="@string/amortization_1" 
         android:padding="3dip"/> 
        <TextView 
         android:text="@string/amortization_2" 
         android:padding="3dip"/> 
        <TextView 
         android:text="@string/amortization_3" 
         android:padding="3dip"/> 
        <TextView 
         android:text="@string/amortization_4" 
         android:padding="3dip"/> 
        <TextView 
         android:text="@string/amortization_5" 
         android:padding="3dip"/> 
        <TextView 
         android:text="@string/amortization_6" 
         android:padding="3dip"/> 
        <TextView 
         android:text="@string/amortization_7" 
         android:padding="3dip"/> 
       </TableRow> 
     </TableLayout> 
    </HorizontalScrollView> 
</ScrollView> 

Tiến hành các bước như vậy và kết hợp nó, sẽ cho phép bạn để đạt được hiệu quả mong muốn.

+0

Hi Avanz, cảm ơn bạn cho bài viết của bạn và ảnh chụp màn hình - họ giúp đỡ. Nội dung bạn hiển thị cho vuốt ngang hiển thị thay đổi toàn màn hình. Tôi đang cố gắng thực hiện một khung nhìn ở mặt trước có thể được vuốt theo chiều ngang, và các khung nhìn đằng sau nó vẫn giữ nguyên. – gnB

+1

Ah .. Tôi thấy bây giờ trong các ghi chú của bạn rằng tôi nên tiếp tục lặp lại từ mã khởi động mà bạn đã liệt kê và thử kết hợp các cách tiếp cận khác nhau để phù hợp với các yêu cầu trong tầm tay. Cảm ơn bạn đã chia sẻ mã và ý tưởng về một số cách khác nhau mà tôi có thể tiến hành với cách tiếp cận đã nói. – gnB

+0

Tôi đã thử đề xuất của bạn để sử dụng dự án này https://github.com/cthibault/CardDeck, nhưng tôi đã không tìm ra cách chạy mã như vậy mà tôi có thể thấy các yếu tố Giao diện người dùng Thẻ & Deck. Tôi chỉ thấy màn hình Hello World và menu tùy chọn không hoạt động. Tôi đã nhập cả hai dự án trong thư mục gốc đó vào ADT và thử chạy cả hai. Dự án thử nghiệm dường như chỉ là các bài kiểm tra đơn vị, mà không có bất kỳ giao diện người dùng nào để xem xét. Tôi đoán bạn phải có thể nhìn thấy một cái gì đó trong môi trường của bạn khi bạn chạy dự án CardDeck chính? – gnB

0

Hãy thử mẫu này số-

public class Main extends Activity { 

    int position=0; 
    LinearLayout full; 
    Intent intent; 

    public Integer[] images= { 
       R.drawable.image1, R.drawable.image2, 
       R.drawable.image3, R.drawable.image4, 
       R.drawable.image5, R.drawable.image6 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);  
     full = (LinearLayout) findViewById(R.id.full); 
     changeImage(); 
     ActivitySwipeDetector activitySwipeDetector = new ActivitySwipeDetector(this); 
     full.setOnTouchListener(activitySwipeDetector); 
    } 



    private void changeImage(){ 
     full.setBackgroundResource(images[position]); 
    } 

    public class ActivitySwipeDetector implements View.OnTouchListener { 

     static final String logTag = "ActivitySwipeDetector"; 
     static final int MIN_DISTANCE = 100; 
     private float downX, upX; 
     Activity activity; 

     public ActivitySwipeDetector(Activity activity){ 
      this.activity = activity; 
     } 

     public void onRightToLeftSwipe(){ 
      Log.i(logTag, "RightToLeftSwipe!"); 
      if(position < images.length - 1){ 
       position++; 
       changeImage(); 
      } 
    } 

     public void onLeftToRightSwipe(){ 
      Log.i(logTag, "LeftToRightSwipe!"); 
      if(position > 0){ 
       position--; 
       changeImage(); 
      } 
     } 

     public boolean onTouch(View v, MotionEvent event) { 
      switch(event.getAction()){ 
       case MotionEvent.ACTION_DOWN: { 
        downX = event.getX(); 
        return true; 
       } 
       case MotionEvent.ACTION_UP: { 
        upX = event.getX(); 

        float deltaX = downX - upX; 

        // swipe horizontal? 
        if(Math.abs(deltaX) > MIN_DISTANCE){ 
         // left or right 
         if(deltaX < 0) { this.onLeftToRightSwipe(); return true; } 
         if(deltaX > 0) { this.onRightToLeftSwipe(); return true; } 
        } 
        else { 
          Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE); 
          return false; // We don't consume the event 
        } 


        return true; 
       } 
      } 
      return false; 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
    } 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
    }  
} 

XML-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/full" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scaleType="centerInside" 
    android:orientation="vertical" /> 
+0

Tôi đang thử giải pháp này, nhưng tôi nhận được lỗi trên biến 'mThumbId' vì khai báo bị thiếu; xảy ra ở dòng này: if (position gnB

+0

@gnB Thay thế mThumbId bằng hình ảnh. Xem bài viết đã chỉnh sửa của tôi. –

Các vấn đề liên quan