Android 圖片特效如何?及總結_Android

來源:互聯網
上載者:User

Android 圖形特效

             最近公司項目,有一個需求是做圖片特效的任務,自己寫了代碼實現特效,但是不是很好,上網搜了相關資料,整理了一下比較全面的Android 圖片特效的資料,大家可以看下,

一.圖形特效(一)特效的實現方式

在Android中,提供了3種方式實現特效,setXXX方法,postXXX和preXXX()方法。

1.setXXX方法用於直接設定Matrix的值,每使用一次setXXX()方法,整個的Matrix都會變掉。

2.postXXX方法用於採用後乘的方式為Matrix設定值,可以連續多次使用post完成多個變換

3.preXXX方法用於採用前乘的方式為Matrix設定值,使用preXXX方法的設定作業最先發生.

(二)特效的表現形式

1.旋轉:setRotate(float dgrees,float px,float py)

px、py為旋轉的軸心

2.縮放:setScale(float sx.float sy)

sx和sy用於指定x軸和軸y軸的縮放比例
Android提供了android.graphics.Matrix類的seetScale(),postScale()和preScale()方法可對映像進行縮放.這三個方法除了方法名不同外,其它的文法格式均相同

3.傾斜 setSkew (float kx.float ky)

ky和ky用於指定x軸和軸y軸的傾斜量
Android提供了android.graphics.Matrix類的setSkew()(),postSkew ()和preSkew()方法可對映像進行傾斜.這三個方法除了方法名不同外,其它的文法格式均相同
setSkew (float sx,float sy,float px,float py)
px 和py是以它們為軸心進行傾斜

4.平移 setTranslate (float dx.float dy)

dy和dy用於指定移動到的位置的x和y的座標
Android提供了android.graphics.Matrix類的setTranslate (),postTranslate ()和 preTranslate ()方法可對映像進行平移.這三個方法除了方法名不同外,其它的文法格式均相同

二.BitmapShader渲染映像

在android中BitmapShader類主要用來渲染映像,如果需要將一張圖片裁剪成橢圓或者圓形等 形狀顯示到螢幕上時,就可以使用BitmapShader類來實現,使用BitmapShader類來渲染映像的
基本步驟如下

建立BitmapShader類的對象, 通過Paint的setShader()方法來設定渲染對象. 在繪製映像時,使用已經設定了setShader()方法的畫筆.

三.下面是一個圖形特效控制的一個樣本

程式通過按鍵來控製圖像的放大縮小、旋轉、傾斜。

(一)自訂的View的代碼

package lesson10_fragmentfordata.myapplication;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Matrix;import android.util.AttributeSet;import android.view.KeyEvent;import android.view.View;/** * 映像特效的示範 */public class MyView extends View {  //定義Bitmap對象  Bitmap bitmap;  //建立矩陣對象  Matrix matrix = new Matrix();  //寬和高  int width, height;  //縮放比例  float scale = 1f;  //映像的狀態是縮放還是旋轉  Boolean isScale = false;  //判斷是否旋轉  Boolean istRotate = false;  //x軸方向傾斜的角度  private float sx;  //旋轉的角度  private float degress;  //重寫倆個構造方法  public MyView(Context context) {    super(context);    initView();  }  public MyView(Context context, AttributeSet attrs) {    super(context, attrs);    initView();  }  /**   * 初始化資料   */  private void initView() {    //擷取位元影像  bitmap=getContext().getResources().getDrawable(R.mipmap.img01);    bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.a3);    //擷取寬和高    width = bitmap.getWidth();    height = bitmap.getHeight();    //使當前的視圖擷取焦點    this.setFocusable(true);  }  /**   * 重寫onDraw重繪的方法   */  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    matrix.reset();//重設    if (isScale) {      //伸縮狀態      matrix.setScale(scale, scale);    } else {      //傾斜狀態      matrix.setSkew(sx, 0);    }    if (istRotate) {      //順時針旋轉30度      matrix.setRotate(degress,0.5f*width,0.5f*height);    }    //根據原始位元影像和Matrix建立新圖片    Bitmap bit = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);    //從新繪製位元影像    canvas.drawBitmap(bit, matrix, null);  }  /**   * 鍵盤控制的邏輯   */  @Override  public boolean onKeyDown(int keyCode, KeyEvent event) {    switch (keyCode) {      case KeyEvent.KEYCODE_A://點擊A向左傾斜        isScale = false;        istRotate=false;        sx -= 0.1;        invalidate();//重繪        break;      case KeyEvent.KEYCODE_D://點擊D向右傾斜        isScale = false;        istRotate=false;        sx += 0.1;        invalidate();//重繪        break;      case KeyEvent.KEYCODE_W://點擊W映像變大        isScale = true;        istRotate=false;        scale += 0.1;        invalidate();//重繪        break;      case KeyEvent.KEYCODE_S://點擊S映像變小        isScale = true;        istRotate=false;        scale -= 0.1;        invalidate();//重繪        break;      case KeyEvent.KEYCODE_X://點擊x映像順時針旋轉30度        istRotate = true;        degress += 30;        invalidate();//重繪        break;    }    return super.onKeyDown(keyCode, event);  }}

(二)調用類

public class MainActivity extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(new MyView(this));  }}

程式通過W鍵控制放大後的效果:

程式通過D鍵控制傾斜後的效果:


程式通過X鍵控制旋轉後的效果:

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.