Android 实现view手势滑动

来源:互联网 发布:网络喷子国家治理 编辑:程序博客网 时间:2024/06/03 16:01

前段时间有个朋友问我在Android中怎么去实现view手势滑动,对这个实现的思路则是:监听手势触摸的坐标来实现view坐标的变化,从而实现view的滑动效果。通过Layout()方法来实现滑动,滑动后的目标位置的坐标传递给Layout,这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果。重写onTouchEvent方法。代码很简单,用getX()和getY()获得的是在视图坐标系中的值(),然后将前后移动的增量传递给layout方法而已。值得注意的是,onTouchEvent的返回值为true,让子View消耗这个触摸事件,这涉及到事件分发机制,不懂的同学可以学习一下。
我们来看一下效果图


接下来我们看怎么实现这个自定义view:
package com.haiwei.slideview;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Align;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;/** * 手势滑动view * @author haiwei * */public class SlideView extends View{/** * 最后滑动的X坐标 */private int lastX;/** * 最后滑动的Y坐标 */private int lastY;private Paint mPaint;private Paint mTextPaint;/** * 自定义view初始化显示的X坐标 */private int screenX;/** * 自定义view初始化显示的Y坐标 */private int screenY;public SlideView(Context context) {super(context);init(context);}public SlideView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}private void init(Context context){    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setColor(Color.RED);mPaint.setStrokeWidth(20);mPaint.setStyle(Paint.Style.FILL_AND_STROKE);//获取屏幕的宽高初始化view显示的位置WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);    screenX = wm.getDefaultDisplay().getWidth() / 2;    screenY = wm.getDefaultDisplay().getHeight() / 2;        mTextPaint = new Paint();    //设置画笔抗锯齿    mTextPaint.setAntiAlias(true);    //设置文本居中    mTextPaint.setTextAlign(Align.CENTER);    //设置字体大小    mTextPaint.setTextSize(36);    //设置画笔颜色    mTextPaint.setColor(Color.WHITE);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawCircle(screenX, screenY, 100, mPaint);canvas.drawText("手势滑动按钮", screenX, screenY, mTextPaint);}@SuppressLint("NewApi")@Overridepublic boolean onTouchEvent(MotionEvent event) {//获取当前手指的坐标int currentX = (int) event.getX();int currentY = (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:lastX = currentX;lastY = currentY; break;case MotionEvent.ACTION_MOVE://获取当前偏移的坐标  int biasX = currentX - lastX;int biasY = currentY - lastY;//重写layout方法改变控件所在屏幕的位置layout(getLeft()+biasX, getTop()+biasY, getRight()+biasX, getBottom()+biasY);break;}return true;}}

在XML布局文件里面引用即可:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/rl"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <com.haiwei.slideview.SlideView        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></RelativeLayout>

好了今天就讲这么多了,谢谢大家多多支持和评论 再见.....
0 0
原创粉丝点击