Android開(kāi)發(fā)中使用顏色矩陣改變圖片顏色,透明度及亮度的方法
本文實(shí)例講述了Android開(kāi)發(fā)中使用顏色矩陣改變圖片顏色,透明度及亮度的方法。分享給大家供大家參考,具體如下:
一、如圖

二、代碼實(shí)現(xiàn)
public class ColorImageActivity extends Activity {
private ImageView mImageView;
private SeekBar mSBRed,mSBGreen,mSBBlue,mSBAlpha,mSBLight;
//修改后的圖片
private Bitmap mModBitmap;
//畫(huà)布
private Canvas mCanvas;
//畫(huà)筆
private Paint mPaint;
//顏色矩陣
private ColorMatrix mColorMatrix;
//圖片矩陣
private Matrix mMatrix;
//原圖
private Bitmap mBitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_color);
initViews();
}
private void initViews() {
mImageView = (ImageView) findViewById(R.id.imageView1);
mSBRed = (SeekBar) findViewById(R.id.seekBar1);
mSBGreen = (SeekBar) findViewById(R.id.seekBar2);
mSBBlue = (SeekBar) findViewById(R.id.seekBar3);
mSBAlpha = (SeekBar) findViewById(R.id.seekBar4);
mSBLight = (SeekBar) findViewById(R.id.seekBar5);
mSBRed.setOnSeekBarChangeListener(new RedChangeListener());
mSBGreen.setOnSeekBarChangeListener(new GreenChangeListener());
mSBBlue.setOnSeekBarChangeListener(new BlueChangeListener());
mSBAlpha.setOnSeekBarChangeListener(new AlphaChangeListener());
mSBLight.setOnSeekBarChangeListener(new LightChangeListener());
//創(chuàng)建原圖
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mm0);
//創(chuàng)建修改的圖
mModBitmap = Bitmap.createBitmap(mBitmap.getWidth()+20, mBitmap.getHeight()+20, mBitmap.getConfig());
mCanvas = new Canvas(mModBitmap);
mPaint = new Paint();
mPaint.setColor(Color.BLACK);
mPaint.setAntiAlias(true);
mMatrix = new Matrix();
mColorMatrix = new ColorMatrix();
mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
//繪制原圖
mCanvas.drawBitmap(mBitmap, mMatrix, mPaint);
mImageView.setImageBitmap(mModBitmap);
}
private class RedChangeListener implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progess = seekBar.getProgress();
mColorMatrix.set(new float[]{
progess /128.0f,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,1,0,
});
mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
mCanvas.drawBitmap(mBitmap, mMatrix, mPaint);
mImageView.setImageBitmap(mBitmap);
}
}
private class GreenChangeListener implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progess = seekBar.getProgress();
mColorMatrix.set(new float[]{
1,0,0,0,0,
0,progess/128.0f,0,0,0,
0,0,1,0,0,
0,0,0,1,0,
});
mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
mCanvas.drawBitmap(mBitmap, mMatrix, mPaint);
mImageView.setImageBitmap(mModBitmap);
}
}
private class BlueChangeListener implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progess = seekBar.getProgress();
mColorMatrix.set(new float[]{
1,0,0,0,0,
0,1,0,0,0,
0,0,progess/128.0f,0,0,
0,0,0,1,0,
});
mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
mCanvas.drawBitmap(mBitmap, mMatrix, mPaint);
mImageView.setImageBitmap(mModBitmap);
}
}
private class AlphaChangeListener implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progess = seekBar.getProgress();
mColorMatrix.set(new float[]{
1,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,progess/50.0f,0,
});
mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
mCanvas.drawBitmap(mBitmap, mMatrix, mPaint);
mImageView.setImageBitmap(mModBitmap);
}
}
//更改亮度
private class LightChangeListener implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progess = seekBar.getProgress();
mColorMatrix.set(new float[]{
progess/128.0f,0,0,0,0,
0,progess/128.0f,0,0,0,
0,0,progess/128.0f,0,0,
0,0,0,1,0,
});
mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
mCanvas.drawBitmap(mBitmap, mMatrix, mPaint);
mImageView.setImageBitmap(mModBitmap);
}
}
}
更多關(guān)于A(yíng)ndroid相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Android圖形與圖像處理技巧總結(jié)》、《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
一文詳解在A(yíng)ndroid中Service和AIDL的使用
Service是Android四大組件之一,它是不依賴(lài)于用戶(hù)界面的,就是因?yàn)镾ervice不依賴(lài)與用戶(hù)界面,本文將詳細(xì)介紹在A(yíng)ndroid中Service和AIDL的使用,感興趣的同學(xué)可以參考本文2023-04-04
Android Studio 3.0 新功能全面解析和舊項(xiàng)目適配問(wèn)題
Android Studio是Android的官方IDE。接下來(lái)通過(guò)本文給大家分享Android Studio 3.0 新功能全面解析和舊項(xiàng)目適配問(wèn)題,需要的朋友可以參考下2017-11-11
Android開(kāi)發(fā)使用PopupMenu創(chuàng)建彈出式菜單完整實(shí)例
這篇文章主要介紹了Android開(kāi)發(fā)使用PopupMenu創(chuàng)建彈出式菜單,結(jié)合完整實(shí)例形式分析了Android基于PopupMenu對(duì)象創(chuàng)建的彈出式菜單相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-03-03
Android編程實(shí)現(xiàn)啟動(dòng)另外的APP及傳遞參數(shù)的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)啟動(dòng)另外的APP及傳遞參數(shù)的方法,涉及Activity啟動(dòng)及Intent設(shè)置相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
Android學(xué)習(xí)筆記之ListView復(fù)用機(jī)制詳解
本篇文章主要介紹了Android學(xué)習(xí)筆記之ListView復(fù)用機(jī)制詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
Android編程實(shí)現(xiàn)音量按鈕添加監(jiān)聽(tīng)事件的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)音量按鈕添加監(jiān)聽(tīng)事件的方法,結(jié)合實(shí)例形式分析了Android事件監(jiān)聽(tīng)實(shí)現(xiàn)音量控制的相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
Android Map新用法:MapFragment應(yīng)用介紹
MapView ,MapActivity 這種的局限在于,必須要繼承MapActivity,否則無(wú)法使用MapView,但是,MapFragment 這種的局限在于,必須要安裝Google Play Service ,也就是說(shuō)必須是原生rom。而且sdk要在12以上2013-01-01
Android編程使用緩存優(yōu)化ListView的方法
這篇文章主要介紹了Android編程使用緩存優(yōu)化ListView的方法,涉及ListView針對(duì)sd卡緩存及內(nèi)存緩存的優(yōu)化技巧,需要的朋友可以參考下2015-12-12

