android自定義View圓圈拖動
本文實例為大家分享了android自定義View圓圈拖動的具體代碼,供大家參考,具體內(nèi)容如下
問題:
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;
//構(gòu)造方法,一般會重寫三個
//用于初始化一些數(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è)置畫筆粗細
//獲取整個屏幕的高度和寬度
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(); // 使這些點構(gòu)成封閉的多邊形
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代表自己處理事件
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- android 添加隨意拖動的桌面懸浮窗口
- Android 仿淘寶、京東商品詳情頁向上拖動查看圖文詳情控件DEMO詳解
- Android 可拖動的seekbar自定義進度值
- android 應用內(nèi)部懸浮可拖動按鈕簡單實現(xiàn)代碼
- Android實現(xiàn)ImageView圖片縮放和拖動
- Android 實現(xiàn)可任意拖動的懸浮窗功能(類似懸浮球)
- Android編程之控件可拖動的實現(xiàn)方法
- android Matrix實現(xiàn)圖片隨意放大縮小或拖動
- Android實現(xiàn)跟隨手指拖動并自動貼邊的View樣式(實例demo)
- Android編程實現(xiàn)圖標拖動效果的方法
相關(guān)文章
Android MPAndroidChart開源圖表庫之餅狀圖的代碼
MPAndroidChart是一款基于Android的開源圖表庫,MPAndroidChart不僅可以在Android設(shè)備上繪制各種統(tǒng)計圖表,而且可以對圖表進行拖動和縮放操作,應用起來非常靈活2018-05-05
android同時控制EditText輸入字符個數(shù)和禁止特殊字符輸入的方法
這篇文章主要介紹了android同時控制EditText輸入字符個數(shù)和禁止特殊字符輸入的方法,涉及Android操作EditText控制字符操作的技巧,需要的朋友可以參考下2015-04-04
Windows下搭建Android開發(fā)環(huán)境
這篇文章主要介紹了Windows下搭建Android開發(fā)環(huán)境,需要的朋友可以參考下2015-09-09
Android開發(fā)實現(xiàn)跟隨手指的小球效果示例
這篇文章主要介紹了Android開發(fā)實現(xiàn)跟隨手指的小球效果,涉及Android圖形繪制、事件響應、界面布局等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04
Android 判斷當前網(wǎng)絡(luò)是否可用簡單實例
這篇文章主要介紹了Android 判斷當前網(wǎng)絡(luò)是否可用簡單實例的相關(guān)資料,需要的朋友可以參考下2017-06-06

