我正在尝试在我的应用中实现手势,并且出于某种原因,没有调用onfling()。我尝试阅读关于此的大量帖子,并尝试修复我的代码,但它无法正常工作。以下是我的代码。请看一下:
public class MainMenuSlider extends Activity implements OnClickListener{
protected MyGestureListener myGestureListener;
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private ViewFlipper vf;
private Animation animFlipInNext,animFlipOutNext, animFlipInPrevious, animFlipOutPrevious;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainmenuslider);
myGestureListener = new MyGestureListener(this);
//vf for viewflipper
vf=(ViewFlipper)findViewById(R.id.ViewFlipper01);
animFlipInNext = AnimationUtils.loadAnimation(this, R.anim.flipinnext);
animFlipOutNext = AnimationUtils.loadAnimation(this, R.anim.flipoutnext);
animFlipInPrevious = AnimationUtils.loadAnimation(this, R.anim.flipinprevious);
animFlipOutPrevious = AnimationUtils.loadAnimation(this, R.anim.flipoutprevious);
imageone = (ImageView) findViewById(R.id.imageone);
imagetwo = (ImageView) findViewById(R.id.imagetwo);
imageone.setOnClickListener(myGestureListener);
imagetwo.setOnClickListener(myGestureListener);
}
class MyGestureListener extends SimpleOnGestureListener implements OnTouchListener
{
Context context;
GestureDetector gDetector;
public MyGestureListener()
{
super();
}
public GestureDetector getDetector()
{
return gDetector;
}
public MyGestureListener(Context context)
{
this(context, null);
}
public MyGestureListener(Context context, GestureDetector gDetector)
{
if(gDetector == null)
gDetector = new GestureDetector(context, this);
this.context = context;
this.gDetector = gDetector;
}
public boolean onDown(MotionEvent event)
{
return true;
}
@Override
public boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY)
{
try {
if(e1.getX() > e2.getX() && Math.abs(e1.getX() - e2.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
vf.setInAnimation(animFlipInPrevious);
vf.setOutAnimation(animFlipOutPrevious);
vf.showPrevious();
}else if (e1.getX() < e2.getX() && e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
vf.setInAnimation(animFlipInNext);
vf.setOutAnimation(animFlipOutNext);
vf.showNext();
}
} catch (Exception e) {
// nothing
}
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e)
{
return super.onSingleTapConfirmed(e);
}
public boolean onTouch(View v, MotionEvent event)
{
// Within the MyGestureListener class you can now manage the event.getAction() codes.
// Note that we are now calling the gesture Detectors onTouchEvent. And given we've set this class as the GestureDetectors listener
// the onFling, onSingleTap etc methods will be executed.
return gDetector.onTouchEvent(event);
}
public void onClick(View v)
{
if (v == imageone)
{
Intent j = new Intent(getApplicationContext(), MainActivity.class);
j.putExtra("slideindex", 0);
startActivity(j);
}
if (v == imagetwo)
{
Intent j = new Intent(getApplicationContext(), MainActivity.class);
j.putExtra("slideindex", 1);
startActivity(j);
}
}
public boolean onScroll(MotionEvent e1,MotionEvent e2,float distanceX,float distanceY)
{
return true;
}
}
}
编辑:以下是所请求的主菜单XML文件内容
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#291E3D" >
<ScrollView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical" >
<ViewFlipper android:id="@+id/ViewFlipper01"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center" >
<!-- adding views to ViewFlipper -->
<!-- First Slide -->
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical" >
<TextView android:id="@+id/title1"
android:text="title1"
android:textColor="#ffffff"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginBottom="3dip"
android:textSize="25dip"/>
<ImageView android:id="@+id/imageone"
android:clickable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/splash_screen">
</ImageView>
</LinearLayout>
<!-- Second Slide -->
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical" >
<TextView android:id="@+id/title2"
android:text="title2"
android:textColor="#ffffff"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginBottom="3dip"
android:textSize="25dip" />
<ImageView android:id="@+id/imagetwo"
android:clickable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/sunnahsplash">
</ImageView>
</LinearLayout>
</ViewFlipper>
<!-- footer -->
<LinearLayout android:id="@+id/LinearLayout03"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center"
android:layout_marginTop="10dip">
<Button android:id="@+id/Button02"
android:layout_height="wrap_content"
android:text="<Previous"
android:textSize="18dip"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:layout_marginRight="15dip"
android:padding="5dp"
android:background="@drawable/background_button_slider"></Button>
<Button android:id="@+id/Select"
android:text=" Select "
android:textSize="18dip"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:background="@drawable/background_button_slider"></Button>
<Button android:id="@+id/Button01"
android:text=" Next>"
android:textSize="18dip"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="15dip"
android:padding="5dp"
android:background="@drawable/background_button_slider"></Button>
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
答案 0 :(得分:9)
据我所知,由于滚动视图,投掷不起作用.... 将此代码添加到 MainMenuSlider 类中。
GestureDetector gestureDetector
= new GestureDetector(myGestureListener);
@Override
public boolean dispatchTouchEvent(MotionEvent e)
{
super.dispatchTouchEvent(e);
return gestureDetector.onTouchEvent(e);
}
我已将您的课程代码编辑为
public class MainMenuSlider extends Activity implements OnClickListener{
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private ViewFlipper vf;
private Animation animFlipInNext,animFlipOutNext, animFlipInPrevious, a nimFlipOutPrevious;
private ImageView imageone;
private ImageView imagetwo;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_menu_slider);
//myGestureListener = new MyGestureListener(this);
//vf for viewflipper
vf=(ViewFlipper)findViewById(R.id.ViewFlipper01);
animFlipInNext = AnimationUtils.loadAnimation(this, R.anim.flipinnext);
animFlipOutNext = AnimationUtils.loadAnimation(this, R.anim.flipoutnext);
animFlipInPrevious = AnimationUtils.loadAnimation(this, R.anim.flipinprevious);
animFlipOutPrevious = AnimationUtils.loadAnimation(this, R.anim.flipoutprevious);
imageone = (ImageView) findViewById(R.id.imageone);
imagetwo = (ImageView) findViewById(R.id.imagetwo);
imageone.setOnClickListener(myGestureListener);
imagetwo.setOnClickListener(myGestureListener);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return gestureDetector.onTouchEvent(event);
}
SimpleOnGestureListener simpleOnGestureListener
= new SimpleOnGestureListener(){
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
float sensitvity = 50;
if((e1.getX() - e2.getX()) > sensitvity){
vf.showPrevious();
}else if((e2.getX() - e1.getX()) > sensitvity){
vf.showNext();
}
return true;
}
};
GestureDetector gestureDetector
= new GestureDetector(simpleOnGestureListener);
@Override
public boolean dispatchTouchEvent(MotionEvent e)
{
super.dispatchTouchEvent(e);
return gestureDetector.onTouchEvent(e);
}
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Hello",Toast.LENGTH_SHORT
).show();
}
此代码正常运行..
答案 1 :(得分:1)
要捕获除点击之外的触摸事件,您需要使用自定义手势检测器,可能是您的活动的子类,例如:
private class CustomGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean usedThisFling = false;
// Is it horizontal?
if (Math.abs(velocityX) >= 2.0*Math.abs(velocityY)) {
if (velocityX < 0.0) leftSwipeActions();
else rightSwipeActions();
usedThisFling = true;
}
return usedThisFling;
}
然后,它需要实例化并设置为在onCreate()方法中使用:
// Create it.
final GestureDetector myGestureListener = new GestureDetector(getApplicationContext(), new CustomGestureListener());
// Set it up for use:
imageone.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return myGestureListener.onTouchEvent(event);
}
});
// And put an onClick method it to force it to work (this shouldn't be necessary but
// it seems like sometimes it is)
imageone.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});