手势滑动和简单动画

一、手势滑动

1.我们需要根据滑动手势做界面跳转,GestureDetector封装了可以监听不同手势的方法。这个方法在哪个Activity中使用,这个Activity就能监听这个Activity接收的动作,在这些方法里可以重写需要的动作。

    private GestureDetector gestureDetector;// 声明成员变量

GestureDetector
    gestureDetector = new GestureDetector(this, new OnGestureListener(){
            @Override
            public boolean onDown(MotionEvent e) {
                // 按下
                return false;
            }
            @Override
            public void onShowPress(MotionEvent e) {
                // TODO Auto-generated method stub              
            }
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                // 点击
                return false;
            }
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                // 滑动
                return false;
            }
            @Override
            public void onLongPress(MotionEvent e) {
                // 长按               
            }
            /**
            *onFling为滑动手势, e1为起点坐标,e2为终点坐标
            *在这里消费掉event事件,重写其中的方法以达到需求。
            /
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {
               if(Math.abs(e1.getRawY()-e2.getRawY())>200){
                    Toast.makeText(getApplicationContext(), "不能斜着滑动", 2000).show();
                }
                if(Math.abs(velocityX)<200 ||Math.abs(velocityY)<200){
                    Toast.makeText(getApplicationContext(), "滑动的太慢了,请滑快点", 2000).show();
                }

                //沿X轴水平滑动
                if(e1.getRawX()-e2.getRawX()>200){
                    flingnextpage();//向左滑
                }else if(e2.getRawX()-e1.getRawX()>200){
                    flingpreviouspage();//向右滑
                }
                return true;                
            }           
        });

上面的代码可以用下面的方便类SimpleOnGestureListener来替代,因为它实现了OnGestureListener接口中的所有方法。

gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {

                    @Override
                    public boolean onFling(MotionEvent e1, MotionEvent e2,
                            float velocityX, float velocityY) {
                        if (Math.abs(e1.getRawY() - e2.getRawY()) > 200) {
                            Toast.makeText(getApplicationContext(), "不能斜着滑动",
                                    2000).show();
                        }
                        if (Math.abs(velocityX) < 200
                                || Math.abs(velocityY) < 200) {
                            Toast.makeText(getApplicationContext(),
                                    "滑动的太慢了,请滑快点", 2000).show();
                        }

                        // X轴坐标
                        if (e1.getRawX() - e2.getRawX() > 200) {
                            flingnextpage();// 向左滑
                        } else if (e2.getRawX() - e1.getRawX() > 200) {
                            flingpreviouspage();// 向右滑
                        }
                        return true;
                    }

                });

2.Activity都具有响应触摸事件,也就是说只要触摸Activity,他都会回调一个onTouchEvent()方法。但是在这个方法里无法处理事件,需要配合使用手势识别器(GestureDetector)中的方法onTouchEvent对事件(event)进行分析处理,我们只需要重写这个方法中的操作来达到我们的需求。

     /**
      * 如果这个onTouchEvent(MotionEvent event)方法消费了这个event事件,就返回True,否则false。
      * Activity 被触摸后,会回调此方法onTouchEvent,并回传一个event对象
      * MotionEvent event 对象封装了触摸时的动作信息,包括x、y坐标等等信息 
      */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        gestureDetector.onTouchEvent(event);//这句话的作用:分析了运动事件,相关的触发提供对应的回调(如上onFling方法)。
        return super.onTouchEvent(event);//当触摸屏事件没有被它下面的任何视图处理时才调用这个方法。对于处理发生在窗口边界以外的地方的触摸事件,这是最有用的,因为在那些地方没有view接收这些触摸事件。

    }

注:页面坐标
这里写图片描述

二、简单动画

目的:用XML文件写一个Activity跳转页面的过渡动画。
1. 在res目录下新建anim文件夹,创建两个xml文件并编辑动画动作,一个是进入动作,另一个退出动作。
这里写图片描述

(1)在anim_next_in.xml中写好进入动作。

<?xml version="1.0" encoding="utf-8"?>
<translate
    android:fromXDelta="100%p" <!—当前界面的右侧界面,从右侧滑入当前界面-->
    android:toXDelta="0"
    android:duration="100" <!--移动时间--> 
    xmlns:android="http://schemas.android.com/apk/res/android">
</translate>

(2)在anim_next_out.xml中写好退出动作。

<?xml version="1.0" encoding="utf-8"?>
<translate
    android:fromXDelta="0"  <!—当前界面向左滑出-->
    android:toXDelta="-100%p"
    android:duration="100"
     xmlns:android="http://schemas.android.com/apk/res/android">
</translate>

2.在需要添加手势滑动功能的Activity界面,调用overridePendingTransition方法,可以使此界面实现平移动画。

/**
* overridePendingTransition(int enterAnim, int exitAnim)
* enterAnim为进入当前界面的动画资源ID, exitAnim为退出当前界面的动画资源ID
/
@Override
public void flingnextpage() {
    // TODO Auto-generated method stub
     startActivity(new Intent(this, NewActivity.class));
     overridePendingTransition(R.anim.anim_next_in, R.anim.anim_next_out);
     finish();//关闭当前界面
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值