自定義可拖拽view

2021-08-05 23:45:00 字數 1921 閱讀 8399

我們知道view的繪製有三個重要的過程分別是measure,layout,draw.measure負責測量view的尺寸,layout負責定位view的位置,draw負責把view繪製到上。我們這就是通過layout重新定位view。

public

class

custommoveview

extends

view

public

custommoveview(context context, @nullable attributeset attrs)

public

custommoveview(context context, @nullable attributeset attrs, int defstyleattr)

@override

public

void

computescroll()

@override

protected

void

onmeasure(int widthmeasurespec, int heightmeasurespec)

@override

public

boolean

ontouchevent(motionevent event)

if (gettop() < 0)

if (getright() > widthpixels)

if (getbottom() > heightpixels)

layout(left, top, rignt, bottom);

break;

}return

true;}}

代嗎很簡單,相關方法都有注釋。來看下用法,像textview一樣在xml使用一樣

這裡想說一下getx()與getrawx()的區別。

motionevent下面有兩個方法:

getrawx(); //觸控點相對於螢幕的x座標。

getx(); //你第乙個手指觸控點相對於觸控的控制項本身的x座標。如果你兩個手指下去,想獲取第二的觸控位置就呼叫get(1),後面依次類推。

上面ontouchevent中用getrawx()替換成getx(),**如下:

` public boolean ontouchevent(motionevent event)

if (gettop() < 0)

if (getright() > widthpixels)

if (getbottom() > heightpixels)

layout(left, top, rignt, bottom);

break;

}return true;

}` 與getrawx不同就是 每次layout 後不用重新賦值 lastx、lasty.這是因為getrawx計算的偏移量是相對螢幕的,getx計算的偏移量是相對view本身的。比容下圖中 view水平向右移動兩次,觸控點從a移動到b再移動到c。a—>b : getrawx計算的偏移量是getrawx(b)-getrawx(a);b—>c : getrawx計算的偏移量是getrawx(c)-getrawx(b)所以每次layout後lastx要重新賦值,這很好理解。getx 是獲取相對控制項本身座標值,b相對螢幕的座標是(50,10),layout完成後,b相對view的座標就變成了(10,10),

c相對螢幕的座標是(90,10),layout完成後,c相對view的座標也變回了(10,10),當layout完成後,上一次的參考點座標自己已經改變了,也就不用我們再去給他賦值了(我第一次看這裡有點犯模糊,這裡記錄一下我自己的理解過程,腦子靈活的同學可以繞過)

Android 自定義View實現拖拽效果

先來看一下效果圖 簡單說一下實現步驟 1.建立乙個類繼承view 2.繪製出乙個小球 3.重寫ontouchevent,來根據手指放下,移動,抬起,來控制小球 4.直接在布局中引用 先貼一張圖看下view的座標系 下面就貼一下 最後會給出原始碼 public class customview ext...

自定義view,可拖拽進度和吸附效果的圓形進度條

前言 最近接到乙個需求,第一眼看到ui互動效果時,瞬間想對產品小哥說 尼瑪,這麼會玩,你咋不上天 確認了具體互動細節,喝了兩口農夫三拳,開始了兩耳不聞窗外事,一心只想擼 的過程。先上ui效果 說明 下面是整個自定義view的 public class roundprogressview extend...

Android自定義View 自定義元件

自繪控制項也分兩種,自定義元件和自定義容器,自定義元件是繼承view類,自定義容器時繼承viewgrounp 今天主要分析下自定義元件 還是舉個例子來的實際些,假如我們要畫乙個最簡單的textview,首先想到的就是canvas.drawtext 方法,怎麼畫了?還是得一步一步來 1 寫乙個myte...