天天看點

圖形圖像處理 補間 逐幀 屬性動畫 SurfaceView Bitmap

package com.example.tyxiong.myapplication;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import java.util.ArrayList;
import java.util.List;

/*
 1 用ImageView顯示圖檔
 2 用AnimationDrawable開發逐幀動畫
 3 用Animation開發補間動畫.

* Bitmap BitmapDrawable BitmapFactory 三者關系
* 1 Bitmap代表一個位圖對象.自己有4靜态方法建構Bitmap 從源圖挖生成 源圖挖取并進行Matrix變換 對源位圖縮放生成 生成尺寸的Bitmap
* 2 BitmapDrawable包裝了一個位圖.  通過new包裝Bitmap   其getBitmap()方法可取出其中的Bitmap
* 3 BitmapFactory工具類,有方法4個從不同來源解析建立Bitmap對象.
* Bitmap用後需要回收自己 2方法 isRecyled() recely()
*
* Canvas:依附于View的畫布
*   大量繪制各種圖形 線 點的方法+4方法進行畫布坐标系(左上為0,0)變換. 其實是兩個坐标系.
*
* Paint:畫布上的筆     實際上我覺得Canvas才是筆..
*   11方法進行畫筆設定,其中5個 筆觸寬度/筆觸轉彎/填充風格/填充效果/路徑填充效果 strokewidth strokejoin style shader pathEffect
*
*Path 1首先建立一條路徑 2用Canvas的drawPath()方法繪制出來.
* 3步:  1路徑
*       2Paint 設定pathEffect 6子類
*       3Canvas 繪制出來.
*
* 重調元件的onDraw()方法重繪元件.UI線程中用invalidate(); 非主線程用postinvalidate()
*
*雙緩沖即: 需要實時重繪元件onDraw()且要保留先前的狀态.  先繪制(用Canvas繪制路徑之類的,不會蓋之前)到大小相同的緩沖區,再一起繪制到元件.
*
*使用Matrix控制變換. Bitmap有方法 建立Bitmap并應用Matrix變換
* 3步:  1建立Matrix對象(也可從其他對象擷取)
*       2對Matrix進行變換(4種變換 位移/縮放/旋轉/傾斜 translation/scale/rotate/skew)
*       3把這種變換應用于指定對象.
*
* drawBitmapMesh 扭曲圖像 這是Canvas的draw方法, 即将圖像分成很多小網格 事件點的小距離變換 繪制出來.
*
* shader  Paint的 方法填充效果 5子類 BitmapShader/LinearGradient/RadialGradient/SweepGradient/ComposeShader
*
* 逐幀動畫Frame 大量靜态圖檔集中起來,依次顯示
*   xml 根元素animation-list 1屬性name  子元素item 2屬性 drawable duraing
*   java 1建立AnimationDrawable對象  2 方法addFrame()添加一幀
  預設是不播放的. start() stop()


  補間動畫Tween Anmation為其抽象類 4子類TranslateAnimation AlphaAnimation Scale.../Rotate..
  java 設定開始幀 結束幀 持續時間  Interpolator則控制插值.

  自定義補間:繼承基類Animation,重寫applyTransformation()

屬性動畫:增強版的補間動畫.
    差別:補間動畫僅對4個屬性方面的變化; 屬性動畫能定義任何屬性的變化.
         補間動畫僅能對UI元件執行動畫;屬性動畫能對任何對象執行動畫(不管是否顯示.).

    6相似:都需要指定如duraing/interpolator/repateMode/repateCount/重新整理頻率/組合

    4API Animator ValueAnimator ObjectAnimator AnimatorSet
*   Animator:基類被繼承
*   ValueAnimator:性動畫的時間引擎,隻負責計算各幀的屬性值So要監聽計算的值..它不管為對象設定值.我們來負責.
*       java方式使用步驟4:1用靜态方法(3個)ofInt()/ofFloat(start,end)擷取ValueAnimator動畫對象.
*                        2設定動畫的屬性設定如:duration/repeatMode
*                        3調用動畫對象方法start()開始動畫.
*                        4為動畫設定監聽AnimatorUpdateListener,監聽計算出來的值,并将值應用到對象元件上.
*
*   ObjectAnimator:ValueAnimator的子類,允許對指定對象的屬性執行動畫.簡單些.
*       java方式使用步驟3: 1同樣靜态方法ofxxx(動畫應用的對象,應用的屬性,屬性開始值,結束值)
*                         後兩步同上.無須設定監聽器它會幫我把值應用到屬性上.
*                3注意點:需要為對象的該屬性設定setter()方法,這是對自定義元件而言的.
*                       若屬性值隻設定了一個,則認為是結束值,還需提供getter()方法,的值作為開始值.
*                       動畫應用的對象為View的話,可能要在onAnimationUpdate()方法裡手動調用invlidate()重繪.
*   AnimatorSet:組合動畫,同時,依次
*   Evaluator 控制如何計算屬性值..4子類 int/string/argb/TypeEvaluator(用于實作自定義電腦)
*
    View有3缺點:1 onView()重繪時會重繪整個圖檔
                2 新線程無法直接更新View元件
                3 缺乏雙緩沖機制.
*
*   SurfaceView概述4:1 SurfaceView對應于螢幕上的一塊緩存區.
*                   2 普通View共享一塊緩存區.
*                   3 View繪制在SurfaceView上面.
*                   4 每個Window對應一個Surface(内有Canvas)
*   SurfaceView在遊戲時實顯示有優勢.

    SurfaceHolder:用于在其對應的SurfaceView上繪制圖像.
    使用步驟4:1 擷取SurfaceView對象上的SurfceHolder對象 getHolder()
             2 SurfaceHolder對象方法lockCanvas()擷取SurfaceView上的Canvas
             3 Canvas進行繪制
             4 SurfaceHolder方法unlockCanvas() 釋放,送出繪制.
             還可以實作SurfaceHolder内部接口Callback,監聽SurfaceView的生命狀态.



*
*
*
*
*
* */

public class MainActivity extends Activity {


    private List<Bitmap> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView imageView = (ImageView) findViewById(R.id.imageView2);

        BitmapDrawable drawable= (BitmapDrawable)getResources().getDrawable(R.drawable.icon4);
        assert drawable != null;
        Bitmap bitmap = drawable.getBitmap();
        imageView.setImageBitmap(Bitmap.createBitmap(bitmap, 0, 0, 160, 200));

    }


}