如何水平滚动图像?

时间:2013-02-27 06:44:53

标签: java android

水平滚动视图有问题。

这是我的XML代码:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/relative_layout_id"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/home_title_id"
        android:text="@string/home_title"
        android:layout_marginTop="@dimen/forty_text_size"
        android:textColor="@android:color/white"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:textSize="@dimen/forty_text_size" />

    <LinearLayout
        android:id="@+id/linear_layout_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/home_title_id">

        <HorizontalScrollView
            android:id="@+id/horizontal_view_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

            <ImageView
                android:id="@+id/home_image_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/abc" />
        </HorizontalScrollView>

         </LinearLayout>
        </RelativeLayout>

在我的Java类中,我已经声明了所有小部件的扩展活动,然后我创建了一个类scrollview,扩展了水平滚动视图。

Java代码如下:

class scrollview extends HorizontalScrollView 
    {
        private static final int SWIPE_MIN_DISTANCE = 5;
        private static final int SWIPE_THRESHOLD_VELOCITY = 300;
        private ArrayList mItems = null;
        private GestureDetector mGestureDetector;
        private int mActiveFeature = 0;


        public scrollview(Context context) 
        {
            super(context);
        }

        public void setFeatureItems(ArrayList items)
        {
            LinearLayout internalWrapper = new LinearLayout(getContext());
            internalWrapper.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
            internalWrapper.setOrientation(LinearLayout.HORIZONTAL);
            addView(internalWrapper);
            this.mItems = items;
            for(int i = 0; i< items.size();i++)
            {
                LinearLayout featureLayout = (LinearLayout) View.inflate(this.getContext(),R.layout.activity_main,null);
                //...
              //Create the view for each screen in the scroll view
                //...
                internalWrapper.addView(featureLayout);
            }
            setOnTouchListener(new View.OnTouchListener() 
            {
                @Override
                public boolean onTouch(View v, MotionEvent event) 
                {
                    //If the user swipes
                    if (mGestureDetector.onTouchEvent(event)) 
                    {
                        return true;
                    }
                    else if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL )
                    {
                        int scrollX = getScrollX();
                        int featureWidth = v.getMeasuredWidth();
                        mActiveFeature = ((scrollX + (featureWidth/2))/featureWidth);
                        int scrollTo = mActiveFeature*featureWidth;
                        smoothScrollTo(scrollTo, 0);
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            });
            mGestureDetector = new GestureDetector(new MyGestureDetector());
        }
            class MyGestureDetector extends SimpleOnGestureListener 
            {
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
            {
                try 
                {
                    //right to left
                    if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
                    {
                        int featureWidth = getMeasuredWidth();
                        mActiveFeature = (mActiveFeature < (mItems.size() - 1))? mActiveFeature + 1:mItems.size() -1;
                        smoothScrollTo(mActiveFeature*featureWidth, 0);
                        return true;
                    }
                    //left to right
                    else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
                    {
                        int featureWidth = getMeasuredWidth();
                        mActiveFeature = (mActiveFeature > 0)? mActiveFeature - 1:0;
                        smoothScrollTo(mActiveFeature*featureWidth, 0);
                        return true;
                    }
                } catch (Exception e) {
                        Log.e("Fling", "There was an error processing the Fling event:" + e.getMessage());
                }
                return false;
            }
        }
    }

但没有任何反应,请帮忙。

或者更好的是在ONTOUCH LISTNER功能中拥有滚动类???

2 个答案:

答案 0 :(得分:2)

我认为layout.xml文件中的标记位置错误。将LinearLayout ImageView放在HorizontalScrollView而不是HorizontalScrollView LinearLayout,如下所示:

   <HorizontalScrollView
        android:id="@+id/horizontal_view_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/home_title_id" >
   <LinearLayout
    android:id="@+id/linear_layout_id"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/home_image_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/abc" />
    </LinearLayout>
    </HorizontalScrollView>

答案 1 :(得分:1)

这里不需要java编码。此java编码仅适用于SWIPE功能

单独使用XML编码就足够了!!!但是,采用以下格式

    <HorizontalScrollView
        android:id="@+id/horizontal_view_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/home_title_id" >
   <LinearLayout
    android:id="@+id/linear_layout_id"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/home_image_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/abc" />
    </LinearLayout>
    </HorizontalScrollView>

因为水平滚动只能容纳一个子节点。