Scrollview vertical and horizontal in android

前端 未结 11 766
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-22 05:30

I\'m really tired looking for a solution for vertical and horizontal Scrollview.

I read that there are not any views/layouts in the framework which implement this fe

相关标签:
11条回答
  • 2020-11-22 06:02

    Playing with the code, you can put an HorizontalScrollView into an ScrollView. Thereby, you can have the two scroll method in the same view.

    Source : http://androiddevblog.blogspot.com/2009/12/creating-two-dimensions-scroll-view.html

    I hope this could help you.

    0 讨论(0)
  • 2020-11-22 06:05

    I found a better solution.

    XML: (design.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent">
      <FrameLayout android:layout_width="90px" android:layout_height="90px">
        <RelativeLayout android:id="@+id/container" android:layout_width="fill_parent" android:layout_height="fill_parent">        
        </RelativeLayout>
    </FrameLayout>
    </FrameLayout>
    

    Java Code:

    public class Example extends Activity {
      private RelativeLayout container;
      private int currentX;
      private int currentY;
    
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.design);
    
        container = (RelativeLayout)findViewById(R.id.container);
    
        int top = 0;
        int left = 0;
    
        ImageView image1 = ...
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.setMargins(left, top, 0, 0);               
        container.addView(image1, layoutParams);
    
        ImageView image2 = ...
        left+= 100;
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.setMargins(left, top, 0, 0);               
        container.addView(image2, layoutParams);
    
        ImageView image3 = ...
        left= 0;
        top+= 100;
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.setMargins(left, top, 0, 0);               
        container.addView(image3, layoutParams);
    
        ImageView image4 = ...
        left+= 100;     
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.setMargins(left, top, 0, 0);               
        container.addView(image4, layoutParams);
      }     
    
      @Override 
      public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                currentX = (int) event.getRawX();
                currentY = (int) event.getRawY();
                break;
            }
    
            case MotionEvent.ACTION_MOVE: {
                int x2 = (int) event.getRawX();
                int y2 = (int) event.getRawY();
                container.scrollBy(currentX - x2 , currentY - y2);
                currentX = x2;
                currentY = y2;
                break;
            }   
            case MotionEvent.ACTION_UP: {
                break;
            }
        }
          return true; 
      }
    }
    

    That's works!!!

    If you want to load other layout or control, the structure is the same.

    0 讨论(0)
  • 2020-11-22 06:05

    Option #1: You can come up with a new UI design that does not require simultaneous horizontal and vertical scrolling.

    Option #2: You can obtain the source code to ScrollView and HorizontalScrollView, learn how the core Android team implemented those, and create your own BiDirectionalScrollView implementation.

    Option #3: You can get rid of the dependencies that are requiring you to use the widget system and draw straight to the Canvas.

    Option #4: If you stumble upon an open source application that seems to implement what you seek, look to see how they did it.

    0 讨论(0)
  • 2020-11-22 06:07

    My solution based on Mahdi Hijazi answer, but without any custom views:

    Layout:

    <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/scrollHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <ScrollView 
            android:id="@+id/scrollVertical"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" >
    
            <WateverViewYouWant/>
    
        </ScrollView>
    </HorizontalScrollView>
    

    Code (onCreate/onCreateView):

        final HorizontalScrollView hScroll = (HorizontalScrollView) value.findViewById(R.id.scrollHorizontal);
        final ScrollView vScroll = (ScrollView) value.findViewById(R.id.scrollVertical);
        vScroll.setOnTouchListener(new View.OnTouchListener() { //inner scroll listener         
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return false;
            }
        });
        hScroll.setOnTouchListener(new View.OnTouchListener() { //outer scroll listener         
            private float mx, my, curX, curY;
            private boolean started = false;
    
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                curX = event.getX();
                curY = event.getY();
                int dx = (int) (mx - curX);
                int dy = (int) (my - curY);
                switch (event.getAction()) {
                    case MotionEvent.ACTION_MOVE:
                        if (started) {
                            vScroll.scrollBy(0, dy);
                            hScroll.scrollBy(dx, 0);
                        } else {
                            started = true;
                        }
                        mx = curX;
                        my = curY;
                        break;
                    case MotionEvent.ACTION_UP: 
                        vScroll.scrollBy(0, dy);
                        hScroll.scrollBy(dx, 0);
                        started = false;
                        break;
                }
                return true;
            }
        });
    

    You can change the order of the scrollviews. Just change their order in layout and in the code. And obviously instead of WateverViewYouWant you put the layout/views you want to scroll both directions.

    0 讨论(0)
  • 2020-11-22 06:10

    I have a solution for your problem. You can check the ScrollView code it handles only vertical scrolling and ignores the horizontal one and modify this. I wanted a view like a webview, so modified ScrollView and it worked well for me. But this may not suit your needs.

    Let me know what kind of UI you are targeting for.

    Regards,

    Ravi Pandit

    0 讨论(0)
提交回复
热议问题