1. 程式人生 > >動畫 學習Demo與自定義View: ViewExample

動畫 學習Demo與自定義View: ViewExample

動畫 學習Demo與自定義View: ViewExample

幀動畫 View Animation (Frame Animation(逐幀動畫))

比較有針對性,只是圖片的替換

補間動畫 View Animation(Tween Animation)

支援簡單的縮放、平移、旋轉、透明度基本的動畫
補間動畫給出兩個關鍵幀,通過一些演算法將給定屬性值在給定的時間內在兩個關鍵幀間漸變 –> 使用插值器 開控制 動畫速度 頻率
- Scale 移動
- fromXScale 起始的X方向上相對自身的縮放比例,浮點值,比如1.0代表自身無變化,0.5代表起始時縮小一倍,2.0代表放大一倍
- toXScale 結尾的X方向上相對自身的縮放比例,浮點值
- fromYScale 起始的Y方向上相對自身的縮放比例,浮點值
- toYScale 結尾的Y方向上相對自身的縮放比例,浮點值
- pivotX 縮放起點X軸座標,可以是數值、百分數、百分數p 三種樣式,比如 50、50%、50%p,當為數值時,表示在當前View的左上角,即原點處加上50px,做為起始縮放點;如果是50%,表示在當前控制元件的左上角加上自己寬度的50%做為起始點;如果是50%p,那麼就是表示在當前的左上角加上父控制元件寬度的50%做為起始點x軸座標。
- pivotY 縮放起點Y軸座標,取值及意義跟android:pivotX一樣
- Alpha 透明
- android:fromAlpha 動畫開始的透明度,從0.0 –1.0 ,0.0表示全透明,1.0表示完全不透明
- android:toAlpha 動畫結束時的透明度,也是從0.0 –1.0 ,0.0表示全透明,1.0表示完全不透明
- Roate 縮放
- android:fromDegrees 開始旋轉的角度位置,正值代表順時針方向度數,負值程式碼逆時針方向度數
- android:toDegrees 結束時旋轉到的角度位置,正值代表順時針方向度數,負值程式碼逆時針方向度數
- android:pivotX 縮放起點X軸座標,可以是數值、百分數、百分數p 三種樣式,比如 50、50%、50%p
- android:pivotY 縮放起點Y軸座標,可以是數值、百分數、百分數p 三種樣式,比如 50、50%、50%p
- Translate 旋轉
- android:fromXDelta 起始點X軸座標,可以是數值、百分數、百分數p 三種樣式,比如 50、50%、50%p,
- android:fromYDelta 起始點Y軸從標,可以是數值、百分數、百分數p 三種樣式;
- android:toXDelta 結束點X軸座標
- android:toYDelta 結束點Y軸座標
- Set 集合 共有屬性
- android:duration 動畫持續時間,以毫秒為單位
- android:fillAfter 如果設定為true,控制元件動畫結束時,將保持動畫最後時的狀態
- android:fillBefore 如果設定為true,控制元件動畫結束時,還原到開始動畫前的狀態
- android:fillEnabled 與android:fillBefore 效果相同,都是在動畫結束時,將控制元件還原到初始化狀態
- android:repeatCount 重複次數
- android:repeatMode 重複型別,有reverse和restart兩個值,reverse表示倒序回放,restart表示重新放一遍,必須與repeatCount一起使用才能看到效果。因為這裡的意義是重複的型別,即回放時的動作。
- android:interpolator 設定插值器,其實就是指定的動作效果,比如彈跳效果等,不在這小節中講解,後面會單獨列出一單講解。
- Interpolator 插值器
- AccelerateDecelerateInterpolator 在動畫開始與介紹的地方速率改變比較慢,在中間的時候加速
- AccelerateInterpolator 在動畫開始的地方速率改變比較慢,然後開始加速
- AnticipateInterpolator 開始的時候向後然後向前甩
- AnticipateOvershootInterpolator 開始的時候向後然後向前甩一定值後返回最後的值
- BounceInterpolator 動畫結束的時候彈起
- CycleInterpolator 動畫迴圈播放特定的次數,速率改變沿著正弦曲線
- DecelerateInterpolator 在動畫開始的地方快然後慢
- LinearInterpolator 以常量速率改變
- OvershootInterpolator 向前甩一定值後再回到原來位置

屬性動畫 Property Animation 包含 ValueAnimator和ObjectAnimation

通過動畫的方式來改變View的屬性。
- ValueAnimator 動畫 ofInt ofObject 設定 屬性 區間
- ObjectAnimation
- Interpolator 插值器/加速器
- Evaluator 將插值器返回的數字進度轉成對應的值

View 的基本屬性

  • 幾何圖形 -> 位於 Canvas 下

    • 畫直線 void drawLine (float startX, float startY, float stopX, float stopY, Paint paint)
      • startX:開始點X座標
      • startY:開始點Y座標
      • stopX:結束點X座標
      • stopY:結束點Y座標
        • 多條直線
          void drawLines (float[] pts, Paint paint)
          void drawLines (float[] pts, int offset, int count, Paint paint)
          pts 兩兩連成一條直線
    • 點 void drawPoint (float x, float y, Paint paint)
      • float X:點的X座標
      • float Y:點的Y座標
    • 多個點
      void drawPoints (float[] pts, Paint paint)
      void drawPoints (float[] pts, int offset, int count, Paint paint)
      • int offset:集合中跳過的數值個數,注意不是點的個數!一個點是兩個數值;
      • count:參與繪製的數值的個數,指pts[]里人數值個數,而不是點的個數,因為一個點是兩個數值
      • offset與count的含義:(跳過第一個點,畫出後面兩個點,第四個點不畫),注意一個點是兩個數值!
    • 矩形工具類RectF與Rect
      • RectF RectF(float left, float top, float right, float bottom) 根據四個點構造出一個矩形
      • Rect Rect(int left, int top, int right, int bottom)
    • 矩形
      • void drawRect (float left, float top, float right, float bottom, Paint paint)
      • void drawRect (RectF rect, Paint paint)
      • void drawRect (Rect r, Paint paint)
    • 圓角矩形 void drawRoundRect (RectF rect, float rx, float ry, Paint paint)
      • RectF rect:要畫的矩形
      • float rx:生成圓角的橢圓的X軸半徑
      • float ry:生成圓角的橢圓的Y軸半徑
    • 圓形 void drawCircle (float cx, float cy, float radius, Paint paint)
      • float cx:圓心點X軸座標
      • float cy:圓心點Y軸座標
      • float radius:圓的半徑
    • 橢圓 void drawOval (RectF oval, Paint paint)

    • 弧 void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

      • RectF oval:生成橢圓的矩形
      • float startAngle:弧開始的角度,以X軸正方向為0度
      • float sweepAngle:弧持續的角度
      • boolean useCenter:是否有弧的兩邊,True,還兩邊,False,只有一條弧
    • 普通水平繪製
      • void drawText (String text, float x, float y, Paint paint)
      • void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)
      • void drawText (String text, int start, int end, float x, float y, Paint paint)
      • void drawText (char[] text, int index, int count, float x, float y, Paint paint)
        第一個建構函式:最普通簡單的建構函式;
        第三、四個建構函式:實現擷取一部分字型給圖;
        第二個建構函式:最強大,因為傳入的可以是charSequence型別字型,所以可以實現繪製帶圖片的擴充套件文字(待續),而且還能擷取一部分繪製
    • 指定個個文字位置

      • void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)
      • void drawPosText (String text, float[] pos, Paint paint)
        說明:
        第一個建構函式:實現擷取一部分文字繪製;

        引數說明:
        char[] text:要繪製的文字陣列
        int index::第一個要繪製的文字的索引
        int count:要繪製的文字的個數,用來算最後一個文字的位置,從第一個繪製的文字開始算起
        float[] pos:每個字型的位置,同樣兩兩一組,如{x1,y1,x2,y2,x3,y3……}

    • 沿路徑繪製

      • void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)
      • void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)
        引數說明:

      有關擷取部分字型繪製相關引數(index,count),沒難度,就不再講了,下面首重講hOffset、vOffset
      float hOffset : 與路徑起始點的水平偏移距離
      float vOffset : 與路徑中心的垂直偏移量

  • Paint

    • paint.setAntiAlias(true);//抗鋸齒功能
    • paint.setColor(Color.RED); //設定畫筆顏色
    • paint.setStrokeWidth(30);//設定畫筆寬度
    • paint.setTextSize(12);//設定文字大小
    • paint.setStyle(Style.FILL);//設定填充樣式
      • Paint.Style.FILL :填充內部
      • Paint.Style.FILL_AND_STROKE :填充內部和描邊
      • Paint.Style.STROKE :僅描邊
    • paint.setShadowLayer (float radius, float dx, float dy, int color) 新增陰影
      • radius:陰影的傾斜度
      • dx:水平位移
      • dy:垂直位移
    • setStrokeCap(Paint.Cap cap)
      • BUTT 無線帽
      • SQUARE 方形線帽
      • ROUND 圓形線帽
    • paint.setFakeBoldText(true);//設定是否為粗體文字
    • paint.setUnderlineText(true);//設定下劃線
    • paint.setTextSkewX((float) -0.25);//設定字型水平傾斜度,普通斜體字是-0.25
    • paint.setStrikeThruText(true);//設定帶有刪除線效果
    • paint.setTextAlign(Paint.Align.XXX);
    • LEFT
    • CENTER
    • RIGHT
      原點(x,y)在矩形的 左 居中 右
    • paint.setStrokeJoin(Paint.Join.MITER);
      • Join.MITER(結合處為銳角)
      • Join.Round(結合處為圓弧)
      • Join.BEVEL(結合處為直線)
    • paint.setTextScaleX(2);//只會將水平方向拉伸,高度不會變
    • paint.setTypeface(typeface); 字型樣式設定(Typeface)
      • Typeface create(String familyName, int style) //直接通過指定字型名來載入系統中自帶的文字樣式
      • Typeface create(Typeface family, int style) //通過其它Typeface變數來構建文字樣式
      • Typeface createFromAsset(AssetManager mgr, String path) //通過從Asset中獲取外部字型來顯示字型樣式
      • Typeface createFromFile(String path)//直接從路徑建立
      • Typeface createFromFile(File path)//從外部路徑來建立字型樣式
      • Typeface defaultFromStyle(int style)//建立預設字型
        上面的各個引數都會用到Style變數,Style的列舉值如下:
        Typeface.NORMAL //正常體
        Typeface.BOLD //粗體
        Typeface.ITALIC //斜體
        Typeface.BOLD_ITALIC //粗斜體
      • 使用系統中的字型
      • Typeface defaultFromStyle(int style)//建立預設字型
      • Typeface create(String familyName, int style) //直接通過指定字型名來載入系統中自帶的文字樣式
      • 自字義字型
      • Typeface createFromAsset(AssetManager mgr, String path) //通過從Asset中獲取外部字型來顯示字型樣式
      • Typeface createFromFile(String path)//直接從路徑建立
      • Typeface createFromFile(File path)//從外部路徑來建立字型樣式
    • FontMetrics 文字的 5 條 線
      • 基準點是baseline
      • Ascent是baseline之上至字元最高處的距離
      • Descent是baseline之下至字元最低處的距離
      • Leading文件說的很含糊,其實是上一行字元的descent到下一行的ascent之間的距離
      • Top指的是指的是最高字元到baseline的值,即ascent的最大值
      • 同上,bottom指的是最下字元到baseline的值,即descent的最大值
      • 高度
        Paint.FontMetricsInt fm = paint.getFontMetricsInt();
        int top = baseLineY + fm.top;
        int bottom = baseLineY + fm.bottom;
        //所佔高度
        int height = bottom - top; </li>
        <li>寬度
        int width = paint.measureText(String text);
      • 最小矩形 public void getTextBounds(String text, int start, int end, Rect bounds);
        獲取指定字串所對應的最小矩形,以(0,0)點所在位置為基線
        • text 要測量最小矩形的字串
        • start 要測量起始字元在字串中的索引
        • end 所要測量的字元的長度
        • bounds 接收測量結果
  • Path 將多種複合路徑(多個輪廓,如直線段、二次曲線、立方曲線)封裝在其內部的幾何路徑 (BaseView)

    • paint.setPathEffect();
      • CornerPathEffect——圓形拐角效果 public CornerPathEffect(float radius)
      • DashPathEffect——虛線效果
        public DashPathEffect(float intervals[], float phase)
        intervals 長度必須大於等於2;因為必須有一個實線段和一個空線段來組成虛線。
        個數必須為偶數,如果是基數,最後一個數字將被忽略;這個很好理解,因為一組虛線的組成必然是一個實線和一個空線成對組成的
        phase:開始繪製的偏移值
      • DiscretePathEffect——離散路徑效果
        public DiscretePathEffect(float segmentLength, float deviation)
        第一個引數segmentLength:表示將原來的路徑切成多長的線段。如果值為2,那麼這個路徑就會被切成一段段由長度為2的小線段。所以這個值越小,所切成的小線段越多;這個值越大,所切成的小線段越少。
        第二引數deviation:表示被切成的每個小線段的可偏移距離。值越大,就表示每個線段的可偏移距離就越大,就顯得越凌亂,值越小,每個線段的可偏移原位置的距離就越小
        • PathDashPathEffect——印章路徑效果
          public PathDashPathEffect(Path shape, float advance, float phase,Style style)
          Path shape:表示印章路徑,比如我們下面示例中的三角形加右上角一個點;
          float advance:表示兩個印章路徑間的距離,很容易理解,印章間距離越大,間距就越大。
          float phase:路徑繪製偏移距離,與上面DashPathEffect中的float phase引數意義相同
          Style style:表示在遇到轉角時,如何操作印章以使轉角平滑過渡,取值有:Style.ROTATE,Style.MORPH,Style.TRANSLATE;Style.ROTATE表示通過旋轉印章來過渡轉角;Style.MORPH表示通過變形印章來過渡轉角;Style.TRANSLATE表示通過位移來過渡轉角。這三個效果的具體意義,上面會通過具體示例來分別講解。
    • 直線路徑
      • void moveTo (float x1, float y1):直線的開始點;即將直線路徑的繪製點定在(x1,y1)的位置
      • void lineTo (float x2, float y2):直線的結束點,又是下一次繪製直線路徑的開始點;lineTo()可以一直用
      • void close ():如果連續畫了幾條直線,但沒有形成閉環,呼叫Close()會將路徑首尾點連線起來,形成閉環
    • 矩形路徑
      • void addRect (float left, float top, float right, float bottom, Path.Direction dir)
      • void addRect (RectF rect, Path.Direction dir)
        這裡Path類建立矩形路徑的引數與上篇canvas繪製矩形差不多,唯一不同的一點是增加了Path.Direction引數;
        Path.Direction有兩個值:
        Path.Direction.CCW:是counter-clockwise縮寫,指建立逆時針方向的矩形路徑;
        Path.Direction.CW:是clockwise的縮寫,指建立順時針方向的矩形路徑
    • 圓角矩形路徑
      • void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
      • void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)
        第一個建構函式:可以定製每個角的圓角大小:
        float[] radii:必須傳入8個數值,分四組,分別對應每個角所使用的橢圓的橫軸半徑和縱軸半徑,如{x1,y1,x2,y2,x3,y3,x4,y4},其中,x1,y1對應第一個角的(左上角)用來產生圓角的橢圓的橫軸半徑和縱軸半徑,其它類推……
        第二個建構函式:只能構建統一圓角大小
        float rx:所產生圓角的橢圓的橫軸半徑;
        float ry:所產生圓角的橢圓的縱軸半徑
    • 圓形路徑
      • void addCircle (float x, float y, float radius, Path.Direction dir)
        引數說明:
        float x:圓心X軸座標
        float y:圓心Y軸座標
        float radius:圓半徑
    • 橢圓路徑
      • void addOval (RectF oval, Path.Direction dir)
        引數說明:
        RectF oval:生成橢圓所對應的矩形
        Path.Direction :生成方式,與矩形一樣,分為順時針與逆時針,意義完全相同,不再重複
    • 弧形路徑
      • void addArc (RectF oval, float startAngle, float sweepAngle)
        引數:
        RectF oval:弧是橢圓的一部分,這個引數就是生成橢圓所對應的矩形;
        float startAngle:開始的角度,X軸正方向為0度
        float sweepAngel:持續的度數;
    • 線段軌跡
      • void quadTo (float x1, float y1, float x2, float y2)
    • canvas變換與操作
      • 平移(translate) void translate(float dx, float dy)
        引數說明:
        float dx:水平方向平移的距離,正數指向正方向(向右)平移的量,負數為向負方向(向左)平移的量
        flaot dy:垂直方向平移的距離,正數指向正方向(向下)平移的量,負數為向負方向(向上)平移的量
    • 旋轉(Rotate)
      • void rotate(float degrees)
      • void rotate (float degrees, float px, float py)
        第一個建構函式直接輸入旋轉的度數,正數是順時針旋轉,負數指逆時針旋轉,它的旋轉中心點是原點(0,0)
        第二個建構函式除了度數以外,還可以指定旋轉的中心點座標(px,py)
    • 縮放(scale )
      • public void scale (float sx, float sy)
      • public final void scale (float sx, float sy, float px, float py)
        float sx:水平方向伸縮的比例,假設原座標軸的比例為n,不變時為1,在變更的X軸密度為n*sx;所以,sx為小數為縮小,sx為整數為放大
        float sy:垂直方向伸縮的比例,同樣,小數為縮小,整數為放大
    • 扭曲(skew)
      • void skew (float sx, float sy)
        引數說明:
        float sx:將畫布在x方向上傾斜相應的角度,sx傾斜角度的tan值,
        float sy:將畫布在y軸方向上傾斜相應的角度,sy為傾斜角度的tan值,
    • 裁剪畫布(clip系列函式)
      • boolean clipPath(Path path)
      • boolean clipPath(Path path, Region.Op op)
      • boolean clipRect(Rect rect, Region.Op op)
        • boolean clipRect(RectF rect, Region.Op op)
        • boolean clipRect(int left, int top, int right, int bottom)
      • boolean clipRect(float left, float top, float right, float bottom)
      • boolean clipRect(RectF rect)
      • boolean clipRect(float left, float top, float right, float bottom, Region.Op op)
        • boolean clipRect(Rect rect)
        • boolean clipRegion(Region region)
        • boolean clipRegion(Region region, Region.Op op)
    • 畫布的儲存與恢復(save()、restore())
      • int save ()
      • void restore()
  • 區域(Range)

    • 基本建構函式
      • public Region() //建立一個空的區域
      • public Region(Region region) //拷貝一個region的範圍
      • public Region(Rect r) //建立一個矩形的區域
      • public Region(int left, int top, int right, int bottom) //建立一個矩形的區域
        第二個建構函式是通過其它的Region來複制一個同樣的Region變數
        第三個,第四個才是正規常的,根據一個矩形或矩形的左上角和右下角點構造出一個矩形區域
    • 間接構造
      • public void setEmpty() //置空
      • public boolean set(Region region)
      • public boolean set(Rect r)
      • public boolean set(int left, int top, int right, int bottom)
      • public boolean setPath(Path path, Region clip)
        這是Region所具有的一系列Set方法,我這裡全部列了出來,下面一一對其講解:
        注意:無論呼叫Set系列函式的Region是不是有區域值,當呼叫Set系列函式後,原來的區域值就會被替換成Set函式裡的區域。
        SetEmpty():從某種意義上講置空也是一個建構函式,即將原來的一個區域變數變成了一個空變數,要再利用其它的Set方法重新構造區域。
        set(Region region):利用新的區域值來替換原來的區域
        set(Rect r):利用矩形所代表的區域替換原來的區域
        set(int left, int top, int right, int bottom):同樣,根據矩形的兩個點構造出矩形區域來替換原來的區域值
        setPath(Path path, Region clip):根據路徑的區域與某區域的交集,構造出新區域,這個後面具體講解
    • 使用SetPath()構造不規則區域
      • boolean setPath (Path path, Region clip)
        Path path:用來構造的區域的路徑
        Region clip:與前面的path所構成的路徑取交集,並將兩交集設定為最終的區域
        由於路徑有很多種構造方法,而且可以輕意構造出非矩形的路徑,這就擺脫了前面的建構函式只能構造矩形區域的限制。但這裡有個問題是要指定另一個區域來取共同的交集,當然如果想顯示路徑構造的區域,Region clip引數可以傳一個比Path範圍大的多的區域,取完交集之後,當然是Path引數所對應的區域嘍。機智的孩子
    • 矩形集列舉區域——RegionIterator類
      • RegionIterator(Region region) //根據區域構建對應的矩形集
      • boolean next(Rect r) //獲取下一個矩形,結果儲存在引數Rect r 中
    • 區域的合併、交叉等操作

      • public final boolean union(Rect r)
      • public boolean op(Rect r, Op op) {
      • public boolean op(int left, int top, int right, int bottom, Op op)
      • public boolean op(Region region, Op op)
      • public boolean op(Rect rect, Region region, Op op)
        “`
        public enum Op {
        DIFFERENCE(0), //最終區域為region1 與 region2不同的區域
        INTERSECT(1), // 最終區域為region1 與 region2相交的區域
        UNION(2), //最終區域為region1 與 region2組合一起的區域
        XOR(3), //最終區域為region1 與 region2相交之外的區域
        REVERSE_DIFFERENCE(4), //最終區域為region2 與 region1不同的區域
        REPLACE(5); //最終區域為為region2的區域
    • 其它一些方法
      /*幾個判斷方法/
      public native boolean isEmpty();//判斷該區域是否為空
      public native boolean isRect(); //是否是一個矩陣
      public native boolean isComplex();//是否是多個矩陣組合
      /*一系列的getBound方法,返回一個Region的邊界/
      public Rect getBounds()
      public boolean getBounds(Rect r)
      public Path getBoundaryPath()
      public boolean getBoundaryPath(Path path)

      /*一系列的判斷是否包含某點 和是否相交/
      public native boolean contains(int x, int y);//是否包含某點
      public boolean quickContains(Rect r) //是否包含某矩形
      public native boolean quickContains(int left, int top, int right,
      int bottom) //是否沒有包含某矩陣形
      public boolean quickReject(Rect r) //是否沒和該矩形相交
      public native boolean quickReject(int left, int top, int right, int bottom); //是否沒和該矩形相交
      public native boolean quickReject(Region rgn); //是否沒和該矩形相交

      /*幾個平移變換的方法/
      public void translate(int dx, int dy)
      public native void translate(int dx, int dy, Region dst);

屬性動畫自定義View Demo

  • 貝塞爾波浪 HandwritingViewo
    • 貝塞爾繪製
    • 動畫 移動
  • 手寫畫板 WaveView
    • 手勢監聽 與 貝塞爾 繪製
  • 圓形載入進度條 CircleProgressView
    • 兩個 drawArc 一個繪製背景 一個繪製進度 sweepAngle
    • drawText 繪製 文字 FontMetricsInt 計算文字大小
  • 自定義控制元件 溫度旋轉按鈕 TempControlView
    • canvas 的應用 儲存 取出 旋轉 移動
    • 手勢 螢幕 角度的判斷