我有一个 imageView 和一个 textView 以及相对布局中的几个元素。如果我在特定元素上滑动,我想触发一个动作。例如,如果尝试向上或向下滑动 imageView ,我想触发操作。如果我刷屏幕的另一部分,什么都不会发生。
我该如何做到这一点?
答案 0 :(得分:2)
我想举个例子,我在图像视图上设置了一个手势监听器,并有各种方法来实际获取图像视图的刷新方式: 活动内部:
public class SwipeImageDemo extends Activity{
ImageView ivSwipe ;
int[] arrImages = new int[]{R.drawable.bot1, R.drawable.bot2, R.drawable.bot3,
R.drawable.bot4, R.drawable.bot5, R.drawable.bot6, R.drawable.bot7};
int currentIndex = 0;
final int MAX_IMAGES = arrImages.length - 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ivSwipe = (ImageView) findViewById(R.id.ivSwipe);
ivSwipe.setImageResource(arrImages[currentIndex]);
ivSwipe.setOnTouchListener(new SwipeHelper(getBaseContext()){
@Override
public void onSwipeLeftToRight() {
currentIndex--;
if(currentIndex<0){
currentIndex = 0;
return;
}
Toast.makeText(getBaseContext(), "swipe right", Toast.LENGTH_SHORT).show();
ivSwipe.setImageResource(arrImages[currentIndex]);
}
@Override
public void onSwipeRightToLeft() {
currentIndex++;
if(currentIndex > MAX_IMAGES){
currentIndex = MAX_IMAGES;
return;
}
Toast.makeText(getBaseContext(), "swipe left", Toast.LENGTH_SHORT).show();
ivSwipe.setImageResource(arrImages[currentIndex]);
}
@Override
public void onSwipeBottomToTop() {
Toast.makeText(getBaseContext(), "SwipeTop", Toast.LENGTH_SHORT).show();
}
@Override
public void onSwipeTopToBottom() {
Toast.makeText(getBaseContext(), "Swipe bottom", Toast.LENGTH_SHORT).show();
}
});
}
}
滑动辅助类:
public class SwipeHelper implements OnTouchListener{
private GestureDetector mGestureDetector;
public SwipeHelper(Context mContext){
mGestureDetector = new GestureDetector(mContext, new MyGestureListener());
}
private class MyGestureListener 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) {
onSwipeLeftToRight();
} else {
onSwipeRightToLeft();
}
}
result = true;
}
else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
onSwipeTopToBottom();
} else {
onSwipeBottomToTop();
}
}
result = true;
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
public void onSwipeRightToLeft() {
}
public void onSwipeLeftToRight() {
}
public void onSwipeBottomToTop() {
}
public void onSwipeTopToBottom() {
}
}
尝试一些解决方法,你应该能够得到你想要的东西
答案 1 :(得分:0)
将View.OnTouchListener
设置为ImageView
。
findViewById(R.id.myImageView).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
// Your code here
}
}