我有一个包含多张卡的CardScrollView。左右滑动在牌之间移动。
有些卡片上有很多内容。我使用了ScrollView,这样用户就可以滚动卡片来查看内容。
当用户出于明显的原因刷手指时,Glass不知道是应该滚动到另一张卡,还是应该滚动到它所在的卡上。它选择滚动到另一张卡。
为了区分,我想使用手势检测器在所选卡片上进行单指滚动和双指滚动。看起来很简单,所以我制作了createGestureDetector()方法,并为每个案例放置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:中的代码段中填充了TextViews
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;
}
我希望这些编辑有帮助!
我的项目也遇到了类似的问题。为了解决这个问题,我必须处理手势检测器中的"onFingerCountChanged",并在我有2个手指计数时取消激活CardScrollView。因此,当我使用一根手指时,cardscrollview可以正常滚动,而当我使用两根手指时,可以使用手势检测器在我的卡中滚动。
你的代码应该看起来像这样:
gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
@Override
public void onFingerCountChanged(int previousCount, int currentCount) {
if(currentCount == 2){
yourCardScrollView.deactivate();
}else{
yourCardScrollView.activate();
}
}
....
}
编辑:我注意到我的第一个答案不起作用。我还有一个。您可以在"活动"中使用以下代码。
@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
如果有效,请回复我。