使用按钮滚动图库

时间:2011-11-14 20:42:27

标签: android button android-layout gallery android-linearlayout

我有一个Gallery,其Adapter可以创建多个LinearLayout实例。然而,这些线性布局实例具有按钮,当有人点击按钮时,他们无法拖动图库。

我的想法是拥有一个用户可以滚动的菜单。通常使用ScrollView完成的事情,但是因为我希望滚动视图“捕捉”到当前按钮页面,所以Gallery更好用。

这个问题类似于这个问题:Android gallery of LinearLayouts

然而,当我在拖动问题时修复了“点击按钮”时,我似乎无法让它像ScrollView一样工作,让按钮作为拖动区域的一部分工作。

任何提示?

不确定代码是否相关,但现在是。

包含图库的布局:

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

        <Gallery
            android:id="@+id/gallery"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" android:fadingEdge="none"
            android:spacing="0dp"/>

</FrameLayout>

填充图库的测试活动:

import com.zehfernando.display.widgets.ZGallery;

public class ScrollTestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.scrolltest);

        Gallery gallery = (Gallery) findViewById(R.id.gallery);
        gallery.setAdapter(new LayoutAdapter(this));
    }

    public class LayoutAdapter extends BaseAdapter {
        private Context mContext;

        public LayoutAdapter(Context c) {
            mContext = c;
        }

        public int getCount() {
            return 3;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View v = vi.inflate(R.layout.scrolllayout, null);
            v.setMinimumWidth(getWindowManager().getDefaultDisplay().getWidth());
            return v;
        }
    }
}

图库内的框架布局:

<?xml version="1.0" encoding="utf-8"?>
<com.zehfernando.display.widgets.ScrollableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/buttonRegister"
        android:layout_width="200dp"
        android:layout_height="72dp"
        android:text="REGISTER"/>

    <Button
        android:id="@+id/buttonUnregister"
        android:layout_width="match_parent"
        android:layout_height="72dp"
        android:text="UNREGISTER" />

</com.zehfernando.display.widgets.ScrollableLinearLayout>

“ScrollableLinearLayout”只是我的类,它扩展了LinearLayout以覆盖onPressed。

1 个答案:

答案 0 :(得分:10)

好吧,我认为我明白了,所以这是为了防止将来遇到这种情况。

我不太了解触摸事件如何在显示列表中传播,所以这比我想承认的尝试和错误要多得多,但基本上:一个人可以拦截父母的触摸事件而不是让它传播给孩子,基本上把按钮变得无用(允许用户点击并拖动它,将事件发送到父亲的onTouchEvent)。这是通过onInterceptTouchEvent方法完成的。

所以我没有使用Gallery,而是扩展了它(现在称它为ZGallery)。这足以使包含的按钮无用:

@Override
public boolean onInterceptTouchEvent(MotionEvent __e) {
    return true;
}

但当然,我想确保按钮工作(它们是可点击的),同时也允许拖动。

可能有一种更聪明的方法可以做到这一点,但我所做的是拦截我的新图库上的触摸事件(如上所述),但允许它通过(返回{{1} })直到用户将'光标'移动了给定的阈值 - 然后我将其解释为拖动意图,开始正确拦截触摸事件。这会导致触摸事件发送到我自己的图库,按预期工作。

您可以对其进行修改,使其仅适用于垂直或水平拖动。

所以无论如何,这是false类的简化版本,允许拖动它内部的任何元素:

Gallery

似乎运作良好。希望它对其他人有帮助!