使用滑动手势查看导航 android

Views Navigation Using Swipe Gesture android

基于 json ArrayList 我正在创建 TextView 的大小。

通过使用 class Display ,使每个 TextView 高度和宽度覆盖整个屏幕。

座右铭

Only 1 TextView should be visible on the screen. By swiping it should move to next view which will again occupy the entire screen.

Swipe down and Swipe up will move the screens i.e., views... swipe left and swipe right should do some other tasks,such as changing activity

使用 GestureDetector.SimpleOnGestureListener

启用滑动

到目前为止,我已经尝试使用 ViewFlipperTextView 数组来启用 TextView 之间的切换。但是失败了:(

代码片段:

        for(int i=0;i<name.size();i++)
        {
            text = new TextView(MainActivity.this);
            text.setText(name.get(i));
            text.setId(i);
            text.setTextColor(Color.parseColor("#000000")); 
            text.setLayoutParams(new LinearLayout.LayoutParams(realWidth, realHeight));
            text.setGravity(Gravity.CENTER);
            text.setTextSize(40);
            text.setClickable(true);
            vf.addView(text);

           /* 
           //I've tried the following code while using TextView array
            myTextViews[i] = text;
            myTextViews[i].setId(i);
            myTextViews[i].setTextColor(Color.BLACK);
            myTextViews[i].setText(name.get(i));
            myTextViews[i].setGravity(Gravity.CENTER);
            myTextViews[i].setTextSize(40);
            myTextViews[i].setLayoutParams(new LinearLayout.LayoutParams(realWidth, realHeight));
            myTextViews[i].onWindowFocusChanged(false);
            LL.addView(myTextViews[i]);
*/

            View lines = new View(getApplicationContext());
            lines.setBackgroundColor(Color.parseColor("#000000"));
            lines.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1));
            vf.addView(lines);

            final int finalI = i;


            text.setOnTouchListener(new MainActivity()
            {
                @Override
                public void onSwipeLeft()
                { 
                    if (vf.getDisplayedChild() == 0)
                        Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show();
                    else
                        vf.showNext();
                }

                @Override
                public void onSwipeRight()
                {
                    if (vf.getDisplayedChild() == 0)
                        Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
                    else
                        vf.showPrevious();
                }
            });
        }

错误:

  1. 同时使用 ViewFlipper

    E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback

  2. 数组:

    E/InputEventReceiver﹕ Exception dispatching input event. -- java.lang.ArrayIndexOutOfBoundsException

编辑

我发现这个 Questionios 相关。搜索相同的 android

I'm trying to develop a app similar to SimplEye which will be used by Visually disabled people.

为此,我需要控制屏幕上的滑动,以便整个应用程序只能通过滑动的帮助来处理。

ViewPager、ViewFlipper、SimpleOnGestureListener 不符合要求。

请建议应该使用什么技术。 谢谢

使用 ViewPager 滑动视图(只能通过滑动手势;如果您需要在一段时间内滑动,那么 ViewFlipper 是更好的方法)。让你的 ViewPager layout_width/layout_height 属性都 match_parent (在 xml 布局中定义 ViewPager 而不是通过代码)。也让你的 TextView layout_width/layout_height match_parent 如此你根本不需要 Display class.

编辑。 根据最新版本,TS 需要在整个应用程序中处理手势导航。我建议如下:

  1. 尽量不要使用任何自行处理手势(点击)的小部件(按钮、复选框等)。仅使用不可交互的视图并在 Activity 中实现 onTouchEvent 方法,在这种情况下它将接收所有触摸事件。在该方法中,您可以添加任何您想要的手势处理。
  2. 您可以创建自己的 ViewGroup 实现并覆盖 onInterceptTouchEvent/onTouchEvent 方法并在那里手动执行任何手势处理。

在这两种情况下,您都需要自己创建所有手势检测逻辑。

这些 link 可能会有帮助

  1. Creating a simple Gesture Application in Android
  2. How to add our own gestures in android?
  3. 检测常见手势

没做过,但第一个 link 似乎最有用。它说您可以首先创建某种手势描述,然后手势 API 可以检查执行的任何手势是否与该描述相匹配。

基于这个问题我可以建议使用 ViewPager

这是您的 MOTTO 的替代方案,而不是您问题的解决方案

activity_main.xml

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

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

ViewPagerActivity

    public class ViewPagerActivity extends Activity {
                String text[] = {"A", "B",
                        "C", "D",
                        "E", "F",
                        "G", "H"};

                @Override
                public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
                    MyPagerAdapter adapter = new MyPagerAdapter(this, text);
                    ViewPager myPager = (ViewPager) findViewById(R.id.viewpager);
                    myPager.setAdapter(adapter);
                    myPager.setCurrentItem(0);
//set Page Change Listner. to get callback on page changed or swiped
    myPager .setOnPageChangeListener(new OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                }

                @Override
                public void onPageSelected(int position) {
                    Log.e("Page Changed ", " YES ");
                    /// here you can check & perform on changed
                    Log.e("Current TextView Text ", text[position]);
                }

                @Override
                public void onPageScrollStateChanged(int state) {

                }
            });

                }
            }

MyPagerAdapter

public class MyPagerAdapter extends PagerAdapter {

        Activity activity;
        int txtarray[];

        public MyPagerAdapter(Activity act, int[] imgArra) {
            txtarray = imgArra;
            activity = act;
        }

        public int getCount() {
            return txtarray.length;
        }

        public Object instantiateItem(View collection, int position) {
            TextView view = new TextView(activity);
            view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                    LayoutParams.FILL_PARENT));
            view.setText(txtarray[position]);
            ((ViewPager) collection).addView(view, 0);
            return view;
        }

        @Override
        public void destroyItem(View arg0, int arg1, Object arg2) {
            ((ViewPager) arg0).removeView((View) arg2);
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == ((View) arg1);
        }

        @Override
        public Parcelable saveState() {
            return null;
        }
    }