1
回答
编写android简单的手势切换视图示例
极速云服务器,低至1.04元/天>>>   

原文转自:http://marshal.easymorse.com/archives/2595

android的home screen,可以通过手指的向左拖动和向右拖动,切换屏幕视图。

这样做的好处是用户体验比较好,比向下滚屏或者使用tab切换视图。

在自己的代码中要用到这个动作效果。这里需要用到:

android.widget.ViewFlipper

ViewFlipper是一种Layout,可以在xml中声明。我的例子只做到:

image

两个视图,手势左右移动,两个视图切换。

xml文件中的内容:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:background="@color/back_ground"> 
    <ViewFlipper android:id="@+id/ViewFlipper01" 
        android:layout_width="wrap_content" android:layout_height="wrap_content"> 
        <LinearLayout android:id="@+id/LinearLayout01" 
            android:layout_width="wrap_content" android:layout_height="wrap_content"> 
            <TextView android:text="第1屏" android:id="@+id/TextView01" 
                android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> 
        </LinearLayout> 
        <LinearLayout android:id="@+id/LinearLayout02" 
            android:layout_width="wrap_content" android:layout_height="wrap_content"> 
            <TextView android:text="第2屏" android:id="@+id/TextView02" 
                android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> 
        </LinearLayout> 
    </ViewFlipper> 
</LinearLayout>

代码也不复杂,需要:

  • 实现OnGestureListener接口,在onFling方法中判断手势的左右移动并给出相应的动作;
  • 创建一个GestureDetector实例,把实现的OnGestureListener实例通过构造方法赋值给它;
  • 覆盖Activity的onTouchEvent方法,在方法内部,调用GestureDetector实例的onTouchEvent方法。

代码:

package com.easymorse;

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.GestureDetector.OnGestureListener; 
import android.widget.ViewFlipper;

public class MainActivity extends Activity implements 
        OnGestureListener {

    private ViewFlipper flipper;

    private GestureDetector detector;

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        detector = new GestureDetector(this); 
        flipper = (ViewFlipper) this.findViewById(R.id.ViewFlipper01); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
        Log.v("golf", "touched"); 
        return this.detector.onTouchEvent(event); 
    }

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

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
            float velocityY) { 
        Log.i("golf", "fling…"); 
        if (e1.getX() > e2.getX()) { 
            this.flipper.showNext(); 
        } else if (e1.getX() < e2.getX()) { 
            this.flipper.showPrevious(); 
        } else { 
            return false; 
        } 
        return true; 
    }

    @Override 
    public void onLongPress(MotionEvent e) { 
    }

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
            float distanceY) { 
        return false; 
    }

    @Override 
    public void onShowPress(MotionEvent e) { 
    }

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
        return false; 
    } 
}

举报
华宰
发帖于6年前 1回/772阅
顶部