android自定义View圆圈拖动

本文实例为大家分享了android自定义View圆圈拖动的具体代码,供大家参考,具体内容如下

问题:

1 . 累加问题:“点击坐标”坐标在移动时必须改变位置,不然将导致累加过载
2. 圆形改变问题,每次刷新时圆必将改变位置
3. 图片平移:圆在移动时只要

public class MovingBlockView extends View {

    //画笔
    Paint paint = new Paint();
    Region circleRegion;
    Path circlePath;
    private boolean Move;

    /*圆心*/
    private float x = 300;
    private float y = 300;

    /*点击坐标*/
    private float ClickX = 0;
    private float ClickY = 0;

    /*圆心移动距离*/
    private float moveX;
    private float moveY;

    /*
    * 圆形拖到问题:
    * 1 。累加问题:“点击坐标”坐标在移动时必须改变位置,不然将导致累加过载
    *  2. 圆形改变问题,每次刷新时圆必将改变位置
    * 3.图片平移:圆在移动时只要
    *
    * */
    public MovingBlockView(Context context) {
        this(context, null);
    }

    public MovingBlockView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MovingBlockView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        /*mPaint = new Paint();
        mPaint.setColor(Color.RED);*/

        paint.setColor(Color.RED);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        circlePath = new Path();
        x = x + moveX;
        y = y + moveY;
        circlePath.addCircle(x, y, 300, Path.Direction.CW);
        Region region = new Region(0, 0, getMeasuredWidth(), getMeasuredHeight());
        circleRegion = new Region();

        circleRegion.setPath(circlePath, region);

        canvas.drawPath(circlePath, paint);
        canvas.drawLine(x + moveX, 0, x + moveX, getHeight(), paint);
        canvas.drawLine(0, y + moveY, getWidth(), y + moveY, paint);

//        canvas.drawCircle();

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        if (action == MotionEvent.ACTION_DOWN) {
            boolean contains = circleRegion.contains((int) event.getX(), (int) event.getY());
            if (contains) {
//                Toast.makeText(getContext(), "点击了圆", Toast.LENGTH_LONG).show();
                Move = true;
                ClickX = event.getX();
                ClickY = event.getY();
                Log.d(TAG, "ACTION_DOWN: " + ClickX);
                Log.d(TAG, "ACTION_DOWN: " + ClickY);
            }
        } else if (action == MotionEvent.ACTION_UP) {
            x = x + moveX;
            y = y + moveY;
            Move = false;
            Log.d(TAG, "ACTION_UP: ");
        } else if (action == MotionEvent.ACTION_MOVE) {
            if (Move) {
                Log.d(TAG, "ACTION_MOVE: ");
                moveX = event.getX() - ClickX;
                moveY = event.getY() - ClickY;
                ClickX = event.getX();
                ClickY = event.getY();
                Log.d(TAG, "ACTION_MOVE: " + moveX);
                Log.d(TAG, "ACTION_MOVE: " + moveY);
                invalidate();
            }
        }
        return super.onTouchEvent(event);
    }
}

小编再为大家分享一段之前收藏的代码:android自定义view圆形可移动

public class Mycircle2 extends View {

    private Paint paint;
    private int rawX;
    private int rawY;
    private int wid;
    private int he;
    int statusBarHeight1 = -1;
    //构造方法,一般会重写三个
    //用于初始化一些数据,或者其他东西
    public Mycircle2(Context context) {
        this(context,null);
    }

    public Mycircle2(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public Mycircle2(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //初始化画笔
        //抗锯齿
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        //设置画笔
        paint.setColor(Color.GREEN);//设置画笔颜色
        paint.setStrokeWidth(3);//设置画笔粗细

        //获取整个屏幕的高度和宽度
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        wid = displayMetrics.widthPixels;
        he = displayMetrics.heightPixels;

        //获取status_bar_height资源的ID  获取状态栏的高度
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            //根据资源ID获取响应的尺寸值
            statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);
        }
    }
    //重写绘制的方法
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(50,50,50,paint);

      /*  paint.setColor(Color.LTGRAY);
        //实例化路径
        Path path = new Path();
        path.moveTo(80, 200);// 此点为多边形的起点
        path.lineTo(120, 250);
        path.lineTo(80, 250);
        path.close(); // 使这些点构成封闭的多边形
        canvas.drawPath(path, paint);*/
    }

    //拖动事件
    //拖动的实现原理:
/**
 * 每个View在屏幕上都有个坐标,也就是上下左右边距,在屏幕上都有(x,y)坐标。如果坐标移动,那么View的位置也会移动
 * ,这是比较好理解的。
 * 我们手指在手机屏幕上滑动的时候,手指的坐标也是移动的。
 * 我们只需要获得手指从按下到离开过程中的距离差,然后将距离差加到原来的坐标上就可以是实现控件的移动。
 * 如果要实现拖动,那么在滑动的过程中,不断的获取距离差,不断的加到原来的坐标就可以了。
 * 注意:
 *     这里的移动是相对于屏幕的,所以我们获取坐标应该是绝对坐标,而不是相对坐标
 *     event.getRawX() ---- 获取绝对X坐标
 *     event.getRawY() ---- 获取绝对Y坐标
 *
 *     event.getX()-------- 获取相对坐标x
 *     event.getY()-------- 获取相对坐标Y
 *
 */

    // onTouchEvent 处理触摸事件
    //Touch事件:1.按下ACTION_DOWN,2.抬起ACTION_UP,3 滑动 ACTION_MOVE 4.取消ACTION_CANCEL
    //获取触摸点的坐标
    //绝对坐标---相对于屏幕来说
    //相对坐标---相对于自己
    //event.getAction()   获取事件

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                //获取开始的坐标
                rawX = (int) event.getRawX();
                rawY = (int) event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                //获取移动时候的坐标
                int yX = (int) event.getRawX();
                int yY = (int) event.getRawY();
                //减去手指按下时候的坐标
                //得到移动的间距
                int jX=yX-rawX;
                int jY=yY-rawY;
                //将间距,加到原来的坐标(上下左右)
                int l=getLeft()+jX;
                int r=getRight()+jX;
                int t=getTop()+jY;
                int b=getBottom()+jY;

                //判断
                if(l<0){
                    l=0;
                    r=getWidth();
                }
                if(t<0){
                    t=0;
                    b=getHeight();
                }

                if(r>wid){
                    r=wid;
                    l=wid-getHeight();
                }
                //如果移动到最下边,就判断是否等于屏幕高度减去状态栏高度
                if(b>he-statusBarHeight1){
                    //赋值
                    b=he-statusBarHeight1;
                    t=b-getHeight();

                }

                //重新赋值给布局
                layout(l,t,r,b);//规定了View的位置
                //将lastX,lastY重新赋值
                rawX=yX;
                rawY=yY;
                break;
            case  MotionEvent.ACTION_UP:

                break;
        }
        return true;//返回true代表自己处理事件
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android编程之控件可拖动的实现方法

    本文实例讲述了Android编程之控件可拖动的实现方法.分享给大家供大家参考,具体如下: 点击和触摸的区别是什么? 点击: 一组动作的集合 手指按下着按钮 手指要在按钮停留一段时间 手指离开按钮 private static final String TAG = "DragViewActivity"; private ImageView iv_dv_view; private TextView tv_drag_view; private int startx; private int

  • Android实现跟随手指拖动并自动贴边的View样式(实例demo)

    效果图 代码 /** * 根据手指拖动的当前位置,自动贴边的View */ public class DragView extends ImageView implements View.OnTouchListener{ private int screenWidth; private int screenHeight; private Context mContext; private int lastX, lastY; private int left ,top; private ViewG

  • Android编程实现图标拖动效果的方法

    本文实例讲述了Android编程实现图标拖动效果的方法.分享给大家供大家参考,具体如下: 最近优化图标拖动时的速率,稍微有一点点效果,直接把代码贴出来,有兴趣一起讨论的朋友可以给我留言. 代码如下: DragView.java package com.android.dragtest; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.

  • android 应用内部悬浮可拖动按钮简单实现代码

    本文介绍了android 应用内部悬浮可拖动按钮简单实现代码,分享给大家,具体如下: 可以悬浮在activity上面,在加载fragment时悬浮按钮不会消失 实现方式很简单,因为是在应用内部拖动的,只需要通过Activity获取WindowManager,然后将要拖动的view设置上去就行 设置代码: WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE); DisplayMetr

  • android Matrix实现图片随意放大缩小或拖动

    本文实例为大家分享了android Matrix图片随意放大缩小和拖动的具体代码,供大家参考,具体内容如下 step1:新建一个项目DragAndZoom,并准备一张照片放在res/drawable-hdpi目录下,如下图所示: step2: 设置应用的UI界面,在main.xml中设置: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://

  • Android 仿淘宝、京东商品详情页向上拖动查看图文详情控件DEMO详解

    一.淘宝商品详情页效果 我们的效果 二.实现思路 使用两个scrollView,两个scrollView 竖直排列,通过自定义viewGroup来控制两个scrollView的竖直排列,以及滑动事件的处理.如下图 三.具体实现 1.继承viewGroup自定义布局View 重写onMeasure()和onLayout方法,在onLayout方法中完成对两个子ScrollView的竖直排列布局,代码如下: 布局文件: <RelativeLayout xmlns:android="http:/

  • android 添加随意拖动的桌面悬浮窗口

    用过新版本android 360手机助手都人都对 360中只在桌面显示一个小小悬浮窗口羡慕不已吧? 其实实现这种功能,主要有两步: 1.判断当前显示的是为桌面.这个内容我在前面的帖子里面已经有过介绍,如果还没看过的赶快稳步看一下哦. 2.使用windowManager往最顶层添加一个View .这个知识点就是为本文主要讲解的内容哦.在本文的讲解中,我们还会讲到下面的知识点: a.如果获取到状态栏的高度 b.悬浮窗口的拖动 c.悬浮窗口的点击事件 有开始之前,我们先来看一下效果图:  接下来我们来

  • Android 可拖动的seekbar自定义进度值

    最近接了个项目其中有需要要实现此功能:seekbar需要显示最左和最右值,进度要跟随进度块移动.下面通过此图给大家展示下效果,可能比文字描述要更清晰. 其实实现起来很简单,主要是思路.自定义控件的话也不难,之前我的博客也有专门介绍,这里就不再多说. 实现方案 这里是通过继承seekbar来自定义控件,这样的方式最快.主要难点在于进度的显示,其实我很的是最笨的方法,就是用了一个popwindow显示在进度条的上方,然后在移动滑块的时候实时的改变它显示的横坐标.看进度显示的核心代码: private

  • Android 实现可任意拖动的悬浮窗功能(类似悬浮球)

    最近开发项目中,有个在屏幕上任意拖动的悬浮窗功能,其实就是利用 WindowManager的api来完成这个需求,具体的实现的功能如下: 1.自定义view import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.util.Log; import android.util.TypedValu

  • Android实现ImageView图片缩放和拖动

    今天我们来编写一个缩放效果的ImageView ,网上有很多人都讲了这些.但有许多人都直接使用了库文件, 那么我们今天做的是直接上代码编写一个拖动和缩放的ImageView,具体看效果图 那么简单了分析一下.在手机上缩放图片和拖动要用到什么?手指对不对 那么控件上什么事件和手机有关.View.OnTouchListener 对不对. ok,那么先新建一个Class ··· public class BaseDragZoomImageView extends ImageView implement

随机推荐