我正在研究Android中的Gesture活动我用类来检测滑动动作
public class ActivitySwipeDetector implements View.OnTouchListener {
static final String logTag = "ActivitySwipeDetector";
private Activity activity;
static final int MIN_DISTANCE = 100;
private float downX, downY, upX, upY;
public ActivitySwipeDetector(Activity activity){
this.activity = activity;
}
public void onRightToLeftSwipe(){
Log.i(logTag, "RightToLeftSwipe!");
Toast.makeText(activity, "RightToLeftSwipe", Toast.LENGTH_SHORT).show();
//activity.doSomething();
}
public void onLeftToRightSwipe(){
Log.i(logTag, "LeftToRightSwipe!");
Toast.makeText(activity, "LeftToRightSwipe", Toast.LENGTH_SHORT).show();
//activity.doSomething();
}
public void onTopToBottomSwipe(){
Log.i(logTag, "onTopToBottomSwipe!");
//Toast.makeText(activity, "onTopToBottomSwipe", Toast.LENGTH_SHORT).show();
//activity.doSomething();
}
public void onBottomToTopSwipe(){
Log.i(logTag, "onBottomToTopSwipe!");
//Toast.makeText(activity, "onBottomToTopSwipe", Toast.LENGTH_SHORT).show();
//activity.doSomething();
}
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN: {
downX = event.getX();
downY = event.getY();
return true;
}
case MotionEvent.ACTION_UP: {
upX = event.getX();
upY = event.getY();
float deltaX = downX - upX;
float deltaY = downY - upY;
// swipe horizontal?
if(Math.abs(deltaX) > MIN_DISTANCE){
// left or right
if(deltaX < 0) { this.onLeftToRightSwipe(); return true; }
if(deltaX > 0) { this.onRightToLeftSwipe(); return true; }
}
else {
Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
return false; // We don't consume the event
}
// swipe vertical?
if(Math.abs(deltaY) > MIN_DISTANCE){
// top or down
if(deltaY < 0) { this.onTopToBottomSwipe(); return true; }
if(deltaY > 0) { this.onBottomToTopSwipe(); return true; }
}
else {
Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
return false; // We don't consume the event
}
return true;
}
}
return false;
}
}
我的xml文件是
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/action_settings"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>
在我的活动中,我这样称呼
ActivitySwipeDetector activitySwipeDetector = new ActivitySwipeDetector(this);
LinearLayout lowestLayout = (LinearLayout)this.findViewById(R.id.action_settings);
lowestLayout.setOnTouchListener(activitySwipeDetector);
我打电话给ActivitySwipeDetector(this);
所以它的工作正常,完全活动。但是,如何仅将滑动检测器应用于LinearLayout而不应用于整个活动。请帮帮我。
答案 0 :(得分:20)
需要我,最好是你的代码,所以我修了一下,需要更多修复,看到评论
public class RelativeLayoutTouchListener implements OnTouchListener {
static final String logTag = "ActivitySwipeDetector";
private Activity activity;
static final int MIN_DISTANCE = 100;// TODO change this runtime based on screen resolution. for 1920x1080 is to small the 100 distance
private float downX, downY, upX, upY;
// private MainActivity mMainActivity;
public RelativeLayoutTouchListener(MainActivity mainActivity) {
activity = mainActivity;
}
public void onRightToLeftSwipe() {
Log.i(logTag, "RightToLeftSwipe!");
Toast.makeText(activity, "RightToLeftSwipe", Toast.LENGTH_SHORT).show();
// activity.doSomething();
}
public void onLeftToRightSwipe() {
Log.i(logTag, "LeftToRightSwipe!");
Toast.makeText(activity, "LeftToRightSwipe", Toast.LENGTH_SHORT).show();
// activity.doSomething();
}
public void onTopToBottomSwipe() {
Log.i(logTag, "onTopToBottomSwipe!");
Toast.makeText(activity, "onTopToBottomSwipe", Toast.LENGTH_SHORT).show();
// activity.doSomething();
}
public void onBottomToTopSwipe() {
Log.i(logTag, "onBottomToTopSwipe!");
Toast.makeText(activity, "onBottomToTopSwipe", Toast.LENGTH_SHORT).show();
// activity.doSomething();
}
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
downX = event.getX();
downY = event.getY();
return true;
}
case MotionEvent.ACTION_UP: {
upX = event.getX();
upY = event.getY();
float deltaX = downX - upX;
float deltaY = downY - upY;
// swipe horizontal?
if (Math.abs(deltaX) > MIN_DISTANCE) {
// left or right
if (deltaX < 0) {
this.onLeftToRightSwipe();
return true;
}
if (deltaX > 0) {
this.onRightToLeftSwipe();
return true;
}
} else {
Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long horizontally, need at least " + MIN_DISTANCE);
// return false; // We don't consume the event
}
// swipe vertical?
if (Math.abs(deltaY) > MIN_DISTANCE) {
// top or down
if (deltaY < 0) {
this.onTopToBottomSwipe();
return true;
}
if (deltaY > 0) {
this.onBottomToTopSwipe();
return true;
}
} else {
Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long vertically, need at least " + MIN_DISTANCE);
// return false; // We don't consume the event
}
return false; // no swipe horizontally and no swipe vertically
}// case MotionEvent.ACTION_UP:
}
return false;
}
}
用法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rlTop = (RelativeLayout) findViewById(R.id.rlTop);
rlTop.setOnTouchListener(new RelativeLayoutTouchListener(this));
}
答案 1 :(得分:0)
我的原始代码效果很好。但是需要将侦听器添加到视图中,而不是布局。毕竟,我们正在扩展View.OnTouchListener。