2

水平スクロールビューに問題があります。

これは私の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リスナー機能にスクロールクラスを含める方が良いでしょうか?

4

2 に答える 2

2

ファイル内のタグの配置が間違っているlayout.xmlと思います。以下のようにin の代わりにLinearLayoutinを配置します。ImageViewHorizontalScrollViewHorizontalScrollViewLinearLayout

   <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>
于 2013-02-27T06:51:26.320 に答える