android自定義View圓圈拖動
更新時間:2021年04月22日 08:47:10 作者:呵呵HL
這篇文章主要為大家詳細介紹了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; //構造方法,一般會重寫三個 //用于初始化一些數(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); //設置畫筆 paint.setColor(Color.GREEN);//設置畫筆顏色 paint.setStrokeWidth(3);//設置畫筆粗細 //獲取整個屏幕的高度和寬度 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獲取響應的尺寸值 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);*/ } //拖動事件 //拖動的實現(xiàn)原理: /** * 每個View在屏幕上都有個坐標,也就是上下左右邊距,在屏幕上都有(x,y)坐標。如果坐標移動,那么View的位置也會移動 * ,這是比較好理解的。 * 我們手指在手機屏幕上滑動的時候,手指的坐標也是移動的。 * 我們只需要獲得手指從按下到離開過程中的距離差,然后將距離差加到原來的坐標上就可以是實現(xiàn)控件的移動。 * 如果要實現(xiàn)拖動,那么在滑動的過程中,不斷的獲取距離差,不斷的加到原來的坐標就可以了。 * 注意: * 這里的移動是相對于屏幕的,所以我們獲取坐標應該是絕對坐標,而不是相對坐標 * 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(); } //如果移動到最下邊,就判斷是否等于屏幕高度減去狀態(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代表自己處理事件 } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- android 添加隨意拖動的桌面懸浮窗口
- Android 仿淘寶、京東商品詳情頁向上拖動查看圖文詳情控件DEMO詳解
- Android 可拖動的seekbar自定義進度值
- android 應用內部懸浮可拖動按鈕簡單實現(xiàn)代碼
- Android實現(xiàn)ImageView圖片縮放和拖動
- Android 實現(xiàn)可任意拖動的懸浮窗功能(類似懸浮球)
- Android編程之控件可拖動的實現(xiàn)方法
- android Matrix實現(xiàn)圖片隨意放大縮小或拖動
- Android實現(xiàn)跟隨手指拖動并自動貼邊的View樣式(實例demo)
- Android編程實現(xiàn)圖標拖動效果的方法
相關文章
Android MPAndroidChart開源圖表庫之餅狀圖的代碼
MPAndroidChart是一款基于Android的開源圖表庫,MPAndroidChart不僅可以在Android設備上繪制各種統(tǒng)計圖表,而且可以對圖表進行拖動和縮放操作,應用起來非常靈活2018-05-05android同時控制EditText輸入字符個數(shù)和禁止特殊字符輸入的方法
這篇文章主要介紹了android同時控制EditText輸入字符個數(shù)和禁止特殊字符輸入的方法,涉及Android操作EditText控制字符操作的技巧,需要的朋友可以參考下2015-04-04Windows下搭建Android開發(fā)環(huán)境
這篇文章主要介紹了Windows下搭建Android開發(fā)環(huán)境,需要的朋友可以參考下2015-09-09Android開發(fā)實現(xiàn)跟隨手指的小球效果示例
這篇文章主要介紹了Android開發(fā)實現(xiàn)跟隨手指的小球效果,涉及Android圖形繪制、事件響應、界面布局等相關操作技巧,需要的朋友可以參考下2019-04-04