最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • Android studio實(shí)現(xiàn)畫板功能

    Android studio實(shí)現(xiàn)畫板功能

    這篇文章主要介紹了Android studio實(shí)現(xiàn)畫板功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Android簡單實(shí)現(xiàn)引導(dǎo)頁

    Android簡單實(shí)現(xiàn)引導(dǎo)頁

    這篇文章主要為大家詳細(xì)介紹了Android簡單實(shí)現(xiàn)引導(dǎo)頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Android View移動(dòng)的3種方式總結(jié)

    Android View移動(dòng)的3種方式總結(jié)

    這篇文章主要給大家介紹了Android View移動(dòng)的三種方式,在介紹這三種方式之前先介紹了Android坐標(biāo)系的定義規(guī)則以及View的一些位置參數(shù)。有需要的朋友們可以參考借鑒。
    2016-09-09
  • Android開發(fā)實(shí)現(xiàn)的圖片點(diǎn)擊切換功能示例

    Android開發(fā)實(shí)現(xiàn)的圖片點(diǎn)擊切換功能示例

    這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)的圖片點(diǎn)擊切換功能,涉及Android ImageView組件創(chuàng)建、布局及實(shí)現(xiàn)圖形切換相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • Android實(shí)現(xiàn)內(nèi)存中數(shù)據(jù)保存到sdcard的方法

    Android實(shí)現(xiàn)內(nèi)存中數(shù)據(jù)保存到sdcard的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)內(nèi)存中數(shù)據(jù)保存到sdcard的方法,涉及Android的文件讀寫與I/O操作相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • Android Volley圖片加載功能詳解

    Android Volley圖片加載功能詳解

    這篇文章主要為大家詳細(xì)介紹了Android Volley圖片加載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android非異常情況下的Activity生命周期分析

    Android非異常情況下的Activity生命周期分析

    這篇文章主要介紹了Android非異常情況下的Activity生命周期分析,幫助大家更好的理解和使用Android,感興趣的朋友可以了解下
    2021-01-01
  • Delphi在Android下使用Java庫的方法

    Delphi在Android下使用Java庫的方法

    這篇文章主要介紹了Delphi在Android下使用Java庫的方法,本文以Android的USB串口通訊庫為例,給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • Android實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能

    Android實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能,能在上次的斷點(diǎn)處繼續(xù)上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Android 使用Gallery實(shí)現(xiàn)3D相冊(cè)(附效果圖+Demo源碼)

    Android 使用Gallery實(shí)現(xiàn)3D相冊(cè)(附效果圖+Demo源碼)

    今天主要是說說如何實(shí)現(xiàn)Gallery的3D顯示切換,Demo的代碼很多是基于網(wǎng)上一些現(xiàn)成效果,感謝這些分享成果的開發(fā)者
    2013-07-07

最新評(píng)論

梁山县| 新巴尔虎左旗| 沂源县| 葵青区| 瑞金市| 万山特区| 东莞市| 门头沟区| 东兰县| 焦作市| 高淳县| 河南省| 河北省| 图片| 宾阳县| 南乐县| 维西| 梁山县| 长岛县| 越西县| 鄂托克旗| 呼图壁县| 胶南市| 乌鲁木齐市| 平昌县| 嫩江县| 黑山县| 思南县| 新晃| 贡山| 汽车| 成武县| 隆昌县| 万盛区| 科尔| 长子县| 饶阳县| 玉田县| 江华| 牟定县| 万年县|