欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

android自定義View圓圈拖動(dòng)

 更新時(shí)間:2021年04月22日 08:47:10   作者:呵呵HL  
這篇文章主要為大家詳細(xì)介紹了android自定義View圓圈拖動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了android自定義View圓圈拖動(dòng)的具體代碼,供大家參考,具體內(nèi)容如下

問題:

1 . 累加問題:“點(diǎn)擊坐標(biāo)”坐標(biāo)在移動(dòng)時(shí)必須改變位置,不然將導(dǎo)致累加過載
2. 圓形改變問題,每次刷新時(shí)圓必將改變位置
3. 圖片平移:圓在移動(dòng)時(shí)只要

public class MovingBlockView extends View {

    //畫筆
    Paint paint = new Paint();
    Region circleRegion;
    Path circlePath;
    private boolean Move;

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

    /*點(diǎn)擊坐標(biāo)*/
    private float ClickX = 0;
    private float ClickY = 0;

    /*圓心移動(dòng)距離*/
    private float moveX;
    private float moveY;


    /*
    * 圓形拖到問題:
    * 1 。累加問題:“點(diǎn)擊坐標(biāo)”坐標(biāo)在移動(dòng)時(shí)必須改變位置,不然將導(dǎo)致累加過載
    *  2. 圓形改變問題,每次刷新時(shí)圓必將改變位置
    * 3.圖片平移:圓在移動(dòng)時(shí)只要
    *
    * */
    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(), "點(diǎn)擊了圓", 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圓形可移動(dòng)

public class Mycircle2 extends View {

    private Paint paint;
    private int rawX;
    private int rawY;
    private int wid;
    private int he;
    int statusBarHeight1 = -1;
    //構(gòu)造方法,一般會(huì)重寫三個(gè)
    //用于初始化一些數(shù)據(jù),或者其他東西
    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);
        //設(shè)置畫筆
        paint.setColor(Color.GREEN);//設(shè)置畫筆顏色
        paint.setStrokeWidth(3);//設(shè)置畫筆粗細(xì)

        //獲取整個(gè)屏幕的高度和寬度
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        wid = displayMetrics.widthPixels;
        he = displayMetrics.heightPixels;

        //獲取status_bar_height資源的ID  獲取狀態(tài)欄的高度
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            //根據(jù)資源ID獲取響應(yīng)的尺寸值
            statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);
        }
    }
    //重寫繪制的方法
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(50,50,50,paint);

      /*  paint.setColor(Color.LTGRAY);
        //實(shí)例化路徑
        Path path = new Path();
        path.moveTo(80, 200);// 此點(diǎn)為多邊形的起點(diǎn)
        path.lineTo(120, 250);
        path.lineTo(80, 250);
        path.close(); // 使這些點(diǎn)構(gòu)成封閉的多邊形
        canvas.drawPath(path, paint);*/
    }

    //拖動(dòng)事件
    //拖動(dòng)的實(shí)現(xiàn)原理:
/**
 * 每個(gè)View在屏幕上都有個(gè)坐標(biāo),也就是上下左右邊距,在屏幕上都有(x,y)坐標(biāo)。如果坐標(biāo)移動(dòng),那么View的位置也會(huì)移動(dòng)
 * ,這是比較好理解的。
 * 我們手指在手機(jī)屏幕上滑動(dòng)的時(shí)候,手指的坐標(biāo)也是移動(dòng)的。
 * 我們只需要獲得手指從按下到離開過程中的距離差,然后將距離差加到原來的坐標(biāo)上就可以是實(shí)現(xiàn)控件的移動(dòng)。
 * 如果要實(shí)現(xiàn)拖動(dòng),那么在滑動(dòng)的過程中,不斷的獲取距離差,不斷的加到原來的坐標(biāo)就可以了。
 * 注意:
 *     這里的移動(dòng)是相對(duì)于屏幕的,所以我們獲取坐標(biāo)應(yīng)該是絕對(duì)坐標(biāo),而不是相對(duì)坐標(biāo)
 *     event.getRawX() ---- 獲取絕對(duì)X坐標(biāo)
 *     event.getRawY() ---- 獲取絕對(duì)Y坐標(biāo)
 *
 *     event.getX()-------- 獲取相對(duì)坐標(biāo)x
 *     event.getY()-------- 獲取相對(duì)坐標(biāo)Y
 *
 */

    // onTouchEvent 處理觸摸事件
    //Touch事件:1.按下ACTION_DOWN,2.抬起ACTION_UP,3 滑動(dòng) ACTION_MOVE 4.取消ACTION_CANCEL
    //獲取觸摸點(diǎn)的坐標(biāo)
    //絕對(duì)坐標(biāo)---相對(duì)于屏幕來說
    //相對(duì)坐標(biāo)---相對(duì)于自己
    //event.getAction()   獲取事件

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                //獲取開始的坐標(biāo)
                rawX = (int) event.getRawX();
                rawY = (int) event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                //獲取移動(dòng)時(shí)候的坐標(biāo)
                int yX = (int) event.getRawX();
                int yY = (int) event.getRawY();
                //減去手指按下時(shí)候的坐標(biāo)
                //得到移動(dòng)的間距
                int jX=yX-rawX;
                int jY=yY-rawY;
                //將間距,加到原來的坐標(biāo)(上下左右)
                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();
                }
                //如果移動(dòng)到最下邊,就判斷是否等于屏幕高度減去狀態(tài)欄高度
                if(b>he-statusBarHeight1){
                    //賦值
                    b=he-statusBarHeight1;
                    t=b-getHeight();

                }

                //重新賦值給布局
                layout(l,t,r,b);//規(guī)定了View的位置
                //將lastX,lastY重新賦值
                rawX=yX;
                rawY=yY;
                break;
            case  MotionEvent.ACTION_UP:

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

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論