android自定義View圓圈拖動(dòng)
本文實(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í)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
