2

我正在考虑创建一个 Android 应用程序作为更广泛的艺术项目的一部分,并且没有 Android 开发经验需要检查是否有可能/可行。

它需要一个非常简单的界面,在包含图像或文本的几个 (15 - 20) 个页面之间导航。导航需要向左/向右和向上/向下滑动。

我已经在一个非常简单的应用程序中使用 PagerAdapter/OnClickListener 实现了概念证​​明(通过复制/粘贴有关该主题的先前问题的代码),但这仅进行左/右切换。

有没有办法使用它在页面之间进行向上/向下导航?任何帮助/建议将不胜感激,

import android.content.Context;
import android.content.Intent;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MyPagerAdapter extends PagerAdapter {


    public int getCount() {
        return 5;
    }


    @Override
    public Object instantiateItem(View container, int position) {
        Context context = container.getContext();
        LinearLayout layout = new LinearLayout(context);

        TextView textItem = new TextView(context);
        Button buttonItem = new Button(context);
        buttonItem.setText("Aceptar");
        buttonItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.phone");

            }
        });


        switch (position) {
        case 0:
           textItem.setText("Photo 1 - begining");
           break;
        case 1:
           textItem.setText("Photo 2");
           break;
        case 2:
            textItem.setText("Photo 3");
            break;


case 3:
        textItem.setText("Photo 4");
        break;
    case 4:
        textItem.setText("Photo 5 - end");
        break;
    }
    layout.addView(textItem);
    ((ViewPager) container).addView(layout, 0); 
    return layout;
}
@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;
}
}

这是给出错误的新代码

未为 Object 类型定义 onTouch(View, MotionEvent) 方法

import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class OnSwipeTouchListener implements OnTouchListener {

    private final GestureDetector gestureDetector = new GestureDetector(new GestureListener());

    public boolean onTouch(final View view, final MotionEvent motionEvent) {
        super.onTouch(view, motionEvent);
        return gestureDetector.onTouchEvent(motionEvent);
    }

    private final class GestureListener extends SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            boolean result = false;
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            onSwipeRight();
                        } else {
                            onSwipeLeft();
                        }
                    }
                } else {
                    if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffY > 0) {
                            onSwipeBottom();
                        } else {
                            onSwipeTop();
                        }
                    }
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }
    }

    public void onSwipeRight() {
    }

    public void onSwipeLeft() {
    }

    public void onSwipeTop() {
    }

    public void onSwipeBottom() {
    }
}
4

2 回答 2

4

出于某种原因,我以为您遇到了运行时错误,但不,您甚至在尝试编译之前就在 Eclipse 中清楚地看到了错误消息。即使编译了该代码,您也必须将手势检测器实际应用于布局容器,以便它执行任何操作。

您正在调用super.onTouch()您的OnSwipeTouchListener类,它是 Object 的子类。Object 没有onTouch()方法,这就是编译器所抱怨的。该onTouch()方法需要进入您的活动,而不是您的自定义手势侦听器。

我猜想无论你使用什么例子,你都会对所有的剪切和粘贴感到困惑。

下面是一些非常简单的示例代码,用于检测定向抛掷,演示如何应用自定义手势侦听器:

http://pcfandroid.wordpress.com/2011/07/17/swipe-with-android-android-tutorial/

那篇文章很容易理解,非常清晰,非常简单。

于 2013-04-23T15:45:43.857 回答
2
    public class Test extends Activity{

private GestureDetector gesturedetector = null;

View layout;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.test);

layout = (LinearLayout)findViewById(R.id.container);

gesturedetector = new GestureDetector(new MyGestureListener());

layout.setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

gesturedetector.onTouchEvent(event);

return true;

}

});

}

public boolean dispatchTouchEvent(MotionEvent ev){

super.dispatchTouchEvent(ev);

return gesturedetector.onTouchEvent(ev);

}

class MyGestureListener extends GestureDetector.SimpleOnGestureListener{

private static final int SWIPE_MIN_DISTANCE = 150;

private static final int SWIPE_MAX_OFF_PATH = 100;

private static final int SWIPE_THRESHOLD_VELOCITY = 100;

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

float velocityY) {

float dX = e2.getX()-e1.getX();

float dY = e1.getY()-e2.getY();

if (Math.abs(dY)<SWIPE_MAX_OFF_PATH &&

Math.abs(velocityX)>=SWIPE_THRESHOLD_VELOCITY &&

Math.abs(dX)>=SWIPE_MIN_DISTANCE ) {

if (dX>0) {

Toast.makeText(getApplicationContext(), “Right Swipe”, Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(getApplicationContext(), “Left Swipe”, Toast.LENGTH_SHORT).show();

}

return true;

} else if (Math.abs(dX)<SWIPE_MAX_OFF_PATH &&

Math.abs(velocityY)>=SWIPE_THRESHOLD_VELOCITY &&

Math.abs(dY)>=SWIPE_MIN_DISTANCE ) {

if (dY>0) {

Toast.makeText(getApplicationContext(), “Up Swipe”, Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(getApplicationContext(), “Down Swipe”, Toast.LENGTH_SHORT).show();

}

return true;

}

return false;

}

}

}
于 2013-12-11T09:57:35.270 回答