1. 程式人生 > >android 自定義view 圓形可移動

android 自定義view 圓形可移動

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代表自己處理事件 } }