Android 圖片特效如何實(shí)現(xiàn)及總結(jié)
Android 圖形特效
最近公司項(xiàng)目,有一個(gè)需求是做圖片特效的任務(wù),自己寫(xiě)了代碼實(shí)現(xiàn)特效,但是不是很好,上網(wǎng)搜了相關(guān)資料,整理了一下比較全面的Android 圖片特效的資料,大家可以看下,
一.圖形特效(一)特效的實(shí)現(xiàn)方式
在Android中,提供了3種方式實(shí)現(xiàn)特效,setXXX方法,postXXX和preXXX()方法。
1.setXXX方法用于直接設(shè)置Matrix的值,每使用一次setXXX()方法,整個(gè)的Matrix都會(huì)變掉。
2.postXXX方法用于采用后乘的方式為Matrix設(shè)置值,可以連續(xù)多次使用post完成多個(gè)變換
3.preXXX方法用于采用前乘的方式為Matrix設(shè)置值,使用preXXX方法的設(shè)置操作最先發(fā)生.
(二)特效的表現(xiàn)形式
1.旋轉(zhuǎn):setRotate(float dgrees,float px,float py)
px、py為旋轉(zhuǎn)的軸心
2.縮放:setScale(float sx.float sy)
sx和sy用于指定x軸和軸y軸的縮放比例
Android提供了android.graphics.Matrix類的seetScale(),postScale()和preScale()方法可對(duì)圖像進(jìn)行縮放.這三個(gè)方法除了方法名不同外,其它的語(yǔ)法格式均相同
3.傾斜 setSkew (float kx.float ky)
ky和ky用于指定x軸和軸y軸的傾斜量
Android提供了android.graphics.Matrix類的setSkew()(),postSkew ()和preSkew()方法可對(duì)圖像進(jìn)行傾斜.這三個(gè)方法除了方法名不同外,其它的語(yǔ)法格式均相同
setSkew (float sx,float sy,float px,float py)
px 和py是以它們?yōu)檩S心進(jìn)行傾斜
4.平移 setTranslate (float dx.float dy)
dy和dy用于指定移動(dòng)到的位置的x和y的坐標(biāo)
Android提供了android.graphics.Matrix類的setTranslate (),postTranslate ()和 preTranslate ()方法可對(duì)圖像進(jìn)行平移.這三個(gè)方法除了方法名不同外,其它的語(yǔ)法格式均相同
二.BitmapShader渲染圖像
在android中BitmapShader類主要用來(lái)渲染圖像,如果需要將一張圖片裁剪成橢圓或者圓形等 形狀顯示到屏幕上時(shí),就可以使用BitmapShader類來(lái)實(shí)現(xiàn),使用BitmapShader類來(lái)渲染圖像的
基本步驟如下
創(chuàng)建BitmapShader類的對(duì)象, 通過(guò)Paint的setShader()方法來(lái)設(shè)置渲染對(duì)象. 在繪制圖像時(shí),使用已經(jīng)設(shè)置了setShader()方法的畫(huà)筆.
三.下面是一個(gè)圖形特效控制的一個(gè)示例
程序通過(guò)按鍵來(lái)控制圖像的放大縮小、旋轉(zhuǎn)、傾斜。
(一)自定義的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對(duì)象 Bitmap bitmap; //創(chuàng)建矩陣對(duì)象 Matrix matrix = new Matrix(); //寬和高 int width, height; //縮放比例 float scale = 1f; //圖像的狀態(tài)是縮放還是旋轉(zhuǎn) Boolean isScale = false; //判斷是否旋轉(zhuǎn) Boolean istRotate = false; //x軸方向傾斜的角度 private float sx; //旋轉(zhuǎn)的角度 private float degress; //重寫(xiě)倆個(gè)構(gòu)造方法 public MyView(Context context) { super(context); initView(); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } /** * 初始化數(shù)據(jù) */ private void initView() { //獲取位圖 bitmap=getContext().getResources().getDrawable(R.mipmap.img01); bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.a3); //獲取寬和高 width = bitmap.getWidth(); height = bitmap.getHeight(); //使當(dāng)前的視圖獲取焦點(diǎn) this.setFocusable(true); } /** * 重寫(xiě)onDraw重繪的方法 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); matrix.reset();//重置 if (isScale) { //伸縮狀態(tài) matrix.setScale(scale, scale); } else { //傾斜狀態(tài) matrix.setSkew(sx, 0); } if (istRotate) { //順時(shí)針旋轉(zhuǎn)30度 matrix.setRotate(degress,0.5f*width,0.5f*height); } //根據(jù)原始位圖和Matrix創(chuàng)建新圖片 Bitmap bit = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); //從新繪制位圖 canvas.drawBitmap(bit, matrix, null); } /** * 鍵盤(pán)控制的邏輯 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_A://點(diǎn)擊A向左傾斜 isScale = false; istRotate=false; sx -= 0.1; invalidate();//重繪 break; case KeyEvent.KEYCODE_D://點(diǎn)擊D向右傾斜 isScale = false; istRotate=false; sx += 0.1; invalidate();//重繪 break; case KeyEvent.KEYCODE_W://點(diǎn)擊W圖像變大 isScale = true; istRotate=false; scale += 0.1; invalidate();//重繪 break; case KeyEvent.KEYCODE_S://點(diǎn)擊S圖像變小 isScale = true; istRotate=false; scale -= 0.1; invalidate();//重繪 break; case KeyEvent.KEYCODE_X://點(diǎn)擊x圖像順時(shí)針旋轉(zhuǎn)30度 istRotate = true; degress += 30; invalidate();//重繪 break; } return super.onKeyDown(keyCode, event); } }
(二)調(diào)用類
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MyView(this)); } }
程序通過(guò)W鍵控制放大后的效果:
程序通過(guò)D鍵控制傾斜后的效果:
程序通過(guò)X鍵控制旋轉(zhuǎn)后的效果:
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android 深入探究自定義view之事件的分發(fā)機(jī)制與處理詳解
對(duì)于安卓程序員來(lái)說(shuō),自定義view簡(jiǎn)直不要太重要,畢竟有很多功能,譬如圓形頭像這些,用單純的原生非常難以實(shí)現(xiàn),而用自定義view,簡(jiǎn)直分分鐘2021-11-11Android中關(guān)于JSON相關(guān)應(yīng)用分析
這篇文章主要介紹了Android中關(guān)于JSON相關(guān)應(yīng)用,較為詳細(xì)的分析了Android中關(guān)于json相關(guān)類與使用方法,需要的朋友可以參考下2016-06-06android開(kāi)發(fā)PathEffect問(wèn)題處理
本文主要整理了關(guān)于android中PathEffect的問(wèn)題匯總以及處理方式,以及給大家做了關(guān)于PathEffect類的詳細(xì)解釋。2017-11-11從0快速搭建一個(gè)實(shí)用的MVVM框架(超詳細(xì))
這篇文章主要介紹了從0搭建一個(gè)實(shí)用的MVVM框架,結(jié)合Jetpack,構(gòu)建快速開(kāi)發(fā)的MVVM框架,支持快速生成ListActivity、ListFragment,主要是基于MVVM進(jìn)行快速開(kāi)發(fā)上手即用,需要的朋友可以參考下2022-03-03Flutter?將Dio請(qǐng)求轉(zhuǎn)發(fā)原生網(wǎng)絡(luò)庫(kù)的實(shí)現(xiàn)方案
這篇文章主要介紹了Flutter?將Dio請(qǐng)求轉(zhuǎn)發(fā)原生網(wǎng)絡(luò)庫(kù),需要注意添加NativeNetInterceptor,如果有多個(gè)攔截器,例如LogInterceptors等等,需要將NativeNetInterceptor放到最后,需要的朋友可以參考下2022-05-05Android Studio中通過(guò)CMake使用NDK并編譯自定義庫(kù)和添加預(yù)編譯庫(kù)
這篇文章是基于Android Studio 3.01版本的,NDK是R16。本文重點(diǎn)給大家介紹Android Studio中通過(guò)CMake使用NDK并編譯自定義庫(kù)和添加預(yù)編譯庫(kù)的相關(guān)知識(shí),感興趣的朋友一起看看吧2018-01-01Android編程使用加速度傳感器實(shí)現(xiàn)搖一搖功能及優(yōu)化的方法詳解
這篇文章主要介紹了Android編程使用加速度傳感器實(shí)現(xiàn)搖一搖功能及優(yōu)化的方法,結(jié)合實(shí)例形式分析了Android傳感器的調(diào)用方法、參數(shù)含義及具體使用技巧,需要的朋友可以參考下2017-08-08