android 自定義view 圓形可移動
阿新 • • 發佈:2019-01-23
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代表自己處理事件
}
}