我們知道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...