【描述1】想用ViewFlipper做一个横向滚动的效果,每次在ViewFlipper滑动时滚动一个屏幕。在ViewFlipper之外还有个TextView。布局大致如下:<?xml version="1.0" encoding="utf-8"?>
<LinearLayout>
<TextView android:text="My course" ></TextView>
<ViewFlipper>
<LinearLayout>
<TextView android:text="11111"></TextView>
</LinearLayout>
<LinearLayout>
<TextView android:text="22222"></TextView>
</LinearLayout>
<LinearLayout>
<TextView android:text="33333"></TextView>
</LinearLayout>
</ViewFlipper>
</LinearLayout>
我先试着对ViewFlipper绑定了OnTouchListener,在onTouch(View v, MotionEvent touchevent)中分别判断MotionEvent.ACTION_DOWN 和 MotionEvent.ACTION_MOVE 的touchevent.getX()。但是一点击就直接触发了翻页动作,如下:vf = (ViewFlipper) findViewById(R.id.layoutswitcher);
vf.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent touchevent) {
Log.e("touchevent", String.valueOf(touchevent.getAction()));
switch (touchevent.getAction())
{
case MotionEvent.ACTION_DOWN:
{
oldTouchValue = touchevent.getX();
break;
}
case MotionEvent.ACTION_MOVE:
{ float currentX = touchevent.getX();
Log.e("touchevent", String.valueOf(oldTouchValue)+" - "+String.valueOf(currentX));
if(currentX>oldTouchValue){
vf.setInAnimation(AnimationUtils.loadAnimation(getApplicationContext(),R.anim.push_right_in));
vf.setOutAnimation(AnimationUtils.loadAnimation(getApplicationContext(),R.anim.push_left_out));
vf.showNext();
}
else {
vf.setInAnimation(AnimationUtils.loadAnimation(getApplicationContext(),R.anim.push_left_in));
vf.setOutAnimation(AnimationUtils.loadAnimation(getApplicationContext(),R.anim.push_right_out));
vf.showPrevious();
}
break;
}
}
return true;
}
});
【问题1】:如何判断是一个滑动的状态呢?【描述2】之后,看了下api,用activity实现了OnGestureListener接口,并重写了activity.onTouchEvent()方法,实现了手指在屏幕上滑动后切换屏幕,但问题是,不光在ViewFlipper范围内滑动会翻页,在整个可视范围内都可以(比如,在布局文件范围内滑动也会翻页)。代码大致如下:public class MyCourse extends Activity implements OnGestureListener { private GestureDetector detector;
protected void onCreate(Bundle savedInstanceState) {
detector = new GestureDetector(getApplicationContext(),this);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return this.detector.onTouchEvent(event);
} @Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (e1.getX() > e2.getX()) {
this.vf.showNext();
} else if (e1.getX() < e2.getX()) {
this.vf.showPrevious();
} else {
return false;
}
return true;
}
}【问题2】如何实现只在ViewFlipper范围内的滑动才会翻页的效果?
<LinearLayout>
<TextView android:text="My course" ></TextView>
<ViewFlipper>
<LinearLayout>
<TextView android:text="11111"></TextView>
</LinearLayout>
<LinearLayout>
<TextView android:text="22222"></TextView>
</LinearLayout>
<LinearLayout>
<TextView android:text="33333"></TextView>
</LinearLayout>
</ViewFlipper>
</LinearLayout>
我先试着对ViewFlipper绑定了OnTouchListener,在onTouch(View v, MotionEvent touchevent)中分别判断MotionEvent.ACTION_DOWN 和 MotionEvent.ACTION_MOVE 的touchevent.getX()。但是一点击就直接触发了翻页动作,如下:vf = (ViewFlipper) findViewById(R.id.layoutswitcher);
vf.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent touchevent) {
Log.e("touchevent", String.valueOf(touchevent.getAction()));
switch (touchevent.getAction())
{
case MotionEvent.ACTION_DOWN:
{
oldTouchValue = touchevent.getX();
break;
}
case MotionEvent.ACTION_MOVE:
{ float currentX = touchevent.getX();
Log.e("touchevent", String.valueOf(oldTouchValue)+" - "+String.valueOf(currentX));
if(currentX>oldTouchValue){
vf.setInAnimation(AnimationUtils.loadAnimation(getApplicationContext(),R.anim.push_right_in));
vf.setOutAnimation(AnimationUtils.loadAnimation(getApplicationContext(),R.anim.push_left_out));
vf.showNext();
}
else {
vf.setInAnimation(AnimationUtils.loadAnimation(getApplicationContext(),R.anim.push_left_in));
vf.setOutAnimation(AnimationUtils.loadAnimation(getApplicationContext(),R.anim.push_right_out));
vf.showPrevious();
}
break;
}
}
return true;
}
});
【问题1】:如何判断是一个滑动的状态呢?【描述2】之后,看了下api,用activity实现了OnGestureListener接口,并重写了activity.onTouchEvent()方法,实现了手指在屏幕上滑动后切换屏幕,但问题是,不光在ViewFlipper范围内滑动会翻页,在整个可视范围内都可以(比如,在布局文件范围内滑动也会翻页)。代码大致如下:public class MyCourse extends Activity implements OnGestureListener { private GestureDetector detector;
protected void onCreate(Bundle savedInstanceState) {
detector = new GestureDetector(getApplicationContext(),this);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return this.detector.onTouchEvent(event);
} @Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (e1.getX() > e2.getX()) {
this.vf.showNext();
} else if (e1.getX() < e2.getX()) {
this.vf.showPrevious();
} else {
return false;
}
return true;
}
}【问题2】如何实现只在ViewFlipper范围内的滑动才会翻页的效果?
public boolean onTouchEvent(MotionEvent event) {
return this.detector.onTouchEvent(event);
}那就不应该在Activity的onTouchEvent里detector.onTouchEvent(event);
应该是ViewFlipper的onTouchEvent里detector.onTouchEvent(event);