同时使用CardScrollView和ScrollView

时间:2014-03-02 09:11:53

标签: android scrollview google-glass google-gdk cardscrollview

我有一张带多张卡的CardScrollView。向左和向右滑动可在卡片之间移动。

有些卡上有很多内容。我使用了ScrollView,因此用户可以滚动卡片以查看内容。

当用户滑动手指时,Glass不知道是否应该滚动到另一张卡片或滚动它所在的卡片上有明显的原因。它选择滚动到另一张卡片。

为了区分,我想使用GestureDetector制作单指滚动滚动卡片,并在所选卡片上滚动两个手指滚动。看起来很简单,所以我创建了createGestureDetector()方法并为每个case添加了if语句。

现在我遇到了问题......我不知道如何告诉CardScrollView推进或回卡,我不知道如何根据手势制作ScrollBody滚动。

我查看了所有可用的方法,并没有任何问题对我来说特别有帮助。有谁知道如何做到这一点?

奖金问题:我看到很多“dispatch”命令,比如dispatchGenericMotionEvent。派遣方法有什么作用?

编辑:

以下是Jean Vacca建议之后的代码:

private GestureDetector createGestureDetector(Context context) {
        GestureDetector gestureDetector = new GestureDetector(context);

        gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
            @Override
            public void onFingerCountChanged(int previousCount, int currentCount) {
                if(currentCount == 2){
                    mCardScrollView.deactivate();
                }else{

                    mCardScrollView.activate();
                }
            }
        });
            return gestureDetector;
    }

我的观点的xml是:

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

    <ScrollView 
        android:id="@+id/scrollBody"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="false">

        <LinearLayout
            android:id="@+id/scrollLinearLayout"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">           
        </LinearLayout>
    </ScrollView>

</RelativeLayout>

在CardScrollAdapter中的此代码段中填充了TextView:

public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        int nextID = 3;

        if (convertView == null) {
            convertView = View.inflate(context, R.layout.my_card, null);
            holder = new ViewHolder();

            MyClass mine = mMyList.get(position);

            LinearLayout ll = (LinearLayout)convertView.findViewById(R.id.scrollLinearLayout);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);

            holder.name = new TextView(this.context);
            holder.name.setId(nextID);
            nextID++;
            holder.name.setTextSize(50);
            holder.name.setText(mine.getName());
            holder.name.setLayoutParams(lp);
            holder.name.setGravity(Gravity.CENTER);
            ll.addView(holder.name);

            holder.infoTextViews = new ArrayList<TextView>(mine.getInfo().size());
            for(int i = 0; i < mine.getInfo().size(); i++)
            {
                holder.infoTextViews.add(new TextView(this.context));
                TextView tv = holder.infoTextViews.get(i);
                tv.setId(nextID);
                nextID++;
                tv.setTextSize(24);
                tv.setText(mine.getInfo().get(i));
                tv.setLayoutParams(lp);
                tv.setGravity(Gravity.CENTER);
                ll.addView(tv);
            }
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        return convertView;
    }

我希望这些编辑有所帮助!

2 个答案:

答案 0 :(得分:3)

我的项目遇到了类似的问题。为了解决这个问题,我必须在GestureDetector中处理“onFingerCountChanged”并在我有2个手指计数时停用CardScrollView。因此,当我使用一根手指时,cardscrollview滚动正常,当我使用两根手指时,可以使用gestureDetector在我的卡片中滚动。

你的代码应该是这样的:

    gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
        @Override
        public void onFingerCountChanged(int previousCount, int currentCount) {
            if(currentCount == 2){
                yourCardScrollView.deactivate();
            }else{

                yourCardScrollView.activate();
            }

        }
        ....
    }

答案 1 :(得分:0)

编辑:我注意到我的第一个答案不起作用。我有另一个。 您可以在“活动”中使用以下代码。

@Override
public boolean dispatchGenericMotionEvent(MotionEvent ev) {
    if (ev.getPointerCount() > 1) {
        return true;
    }
    return super.dispatchGenericMotionEvent(ev);
}

当dispatchGenericMotionEvent处于活动状态时,检测指针是否大于1(muit-touch),返回true并使用它。

我测试了,但仍有bug。 https://code.google.com/p/google-glass-api/issues/detail?id=632
如果有效,请回复我。