안드로이드에서 수직/수평 ScrollView

조회수 2350회

수직/수평 ScrollView에 대한 해결책을 찾고 있습니다.

framework상에는 제가 찾는 view나 layout이 없는 것으로 알고 있는데요. 하지만 다음과 같은 ScrollView가 정말 필요합니다.

다른 layout내에서 자식 layout으로 정의하고 싶고요. 반드시 수직/수평으로 이동이 가능해야합니다.

처음에는 픽셀 단위로 layout을 이동시키는 코드로 시도해봤으나 정확한 방법이 아니었어요. 수직 혹은 수평 한 방향의 이동만 가능했기에 제가 원하던 ScrollView가 아니었죠.

자식 엘리먼트로 리스너를 추가할 것이기 때문에 Canvas는 해결방안이 되지 못합니다.

어떻게 해야할까요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    말씀하신 것들을 종합해서, 해결 방안을 찾았습니다.

    Custom ScrollView:

    package com.scrollable.view;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.widget.ScrollView;
    
    public class VScroll extends ScrollView {
    
        public VScroll(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        public VScroll(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public VScroll(Context context) {
            super(context);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            return false;
        }
    }
    

    Custom HorizontalScrollView:

    package com.scrollable.view;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.widget.HorizontalScrollView;
    
    public class HScroll extends HorizontalScrollView {
    
        public HScroll(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        public HScroll(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public HScroll(Context context) {
            super(context);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            return false;
        }
    }
    

    the ScrollableImageActivity:

    import android.widget.ScrollView;
    
    public class ScrollableImageActivity extends Activity {
    
        private float mx, my;
        private float curX, curY;
    
        private ScrollView vScroll;
        private HorizontalScrollView hScroll;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            vScroll = (ScrollView) findViewById(R.id.vScroll);
            hScroll = (HorizontalScrollView) findViewById(R.id.hScroll);
    
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float curX, curY;
    
            switch (event.getAction()) {
    
                case MotionEvent.ACTION_DOWN:
                    mx = event.getX();
                    my = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    curX = event.getX();
                    curY = event.getY();
                    vScroll.scrollBy((int) (mx - curX), (int) (my - curY));
                    hScroll.scrollBy((int) (mx - curX), (int) (my - curY));
                    mx = curX;
                    my = curY;
                    break;
                case MotionEvent.ACTION_UP:
                    curX = event.getX();
                    curY = event.getY();
                    vScroll.scrollBy((int) (mx - curX), (int) (my - curY));
                    hScroll.scrollBy((int) (mx - curX), (int) (my - curY));
                    break;
            }
    
            return true;
        }
    
    }
    

    Layout:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <com.scrollable.view.VScroll android:layout_height="fill_parent"
            android:layout_width="fill_parent" android:id="@+id/vScroll">
            <com.scrollable.view.HScroll android:id="@+id/hScroll"
                android:layout_width="fill_parent" android:layout_height="fill_parent">
                <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/bg"></ImageView>
            </com.scrollable.view.HScroll>
        </com.scrollable.view.VScroll>
    
    </LinearLayout>
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)