Android 圖片特效如何實(shí)現(xiàn)及總結(jié)
Android 圖形特效
最近公司項(xiàng)目,有一個(gè)需求是做圖片特效的任務(wù),自己寫了代碼實(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()方法可對圖像進(jìn)行縮放.這三個(gè)方法除了方法名不同外,其它的語法格式均相同
3.傾斜 setSkew (float kx.float ky)
ky和ky用于指定x軸和軸y軸的傾斜量
Android提供了android.graphics.Matrix類的setSkew()(),postSkew ()和preSkew()方法可對圖像進(jìn)行傾斜.這三個(gè)方法除了方法名不同外,其它的語法格式均相同
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 ()方法可對圖像進(jìn)行平移.這三個(gè)方法除了方法名不同外,其它的語法格式均相同
二.BitmapShader渲染圖像
在android中BitmapShader類主要用來渲染圖像,如果需要將一張圖片裁剪成橢圓或者圓形等 形狀顯示到屏幕上時(shí),就可以使用BitmapShader類來實(shí)現(xiàn),使用BitmapShader類來渲染圖像的
基本步驟如下
創(chuàng)建BitmapShader類的對象, 通過Paint的setShader()方法來設(shè)置渲染對象. 在繪制圖像時(shí),使用已經(jīng)設(shè)置了setShader()方法的畫筆.
三.下面是一個(gè)圖形特效控制的一個(gè)示例
程序通過按鍵來控制圖像的放大縮小、旋轉(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對象
Bitmap bitmap;
//創(chuàng)建矩陣對象
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;
//重寫倆個(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);
}
/**
* 重寫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);
}
/**
* 鍵盤控制的邏輯
*/
@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));
}
}
程序通過W鍵控制放大后的效果:

程序通過D鍵控制傾斜后的效果:
程序通過X鍵控制旋轉(zhuǎn)后的效果:

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android自定義密碼樣式 黑點(diǎn)轉(zhuǎn)換成特殊字符
這篇文章主要為大家詳細(xì)介紹了Android自定義密碼樣式的制作方法,黑點(diǎn)換成¥、%等特殊字符,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Android使用GridView實(shí)現(xiàn)日歷功能示例(詳細(xì)代碼)
本篇文章主要介紹了Android使用GridView實(shí)現(xiàn)日歷功能示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧2017-01-01
Android SeekBar 自定義thumb旋轉(zhuǎn)動(dòng)畫效果
某些音樂播放或者視頻播放的界面上,資源還在加載時(shí),進(jìn)度條的原點(diǎn)(thumb)會(huì)顯示一個(gè)轉(zhuǎn)圈的效果。這篇文章主要介紹了Android SeekBar 自定義thumb thumb旋轉(zhuǎn)動(dòng)畫效果,需要的朋友可以參考下2021-11-11
Android 2d游戲開發(fā)之貪吃蛇基于surfaceview
這篇文章主要介紹了Android 2d游戲開發(fā)基于surfaceview的貪吃蛇,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Android播放多張圖片形成的一個(gè)動(dòng)畫示例
這篇文章主要介紹了Android播放多張圖片形成的一個(gè)動(dòng)畫實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android逐幀播放動(dòng)畫圖片及ImageView控件的相關(guān)使用技巧,需要的朋友可以參考下2016-10-10
android 仿微信demo——注冊功能實(shí)現(xiàn)(服務(wù)端)
本篇文章主要介紹了微信小程序-閱讀小程序?qū)嵗【幱X得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望能給你們提供幫助2021-06-06

