Paint之setColorFilter(一)
2017-11-10 15:27
253 查看
矩阵乘法:
简介
在编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还要对图片进行变换,以拉伸,扭曲等等。这些效果在android中有很好的支持,通过颜色矩阵(ColorMatrix)和坐标变换矩阵(Matrix)可以完美的做出上面的所说的效果。
颜色矩阵
android中可以通过颜色矩阵(ColorMatrix类)方面的操作颜色,颜色矩阵是一个5x4 的矩阵,如下。
代表的意义如下:
参考:颜色矩阵原理解析
示例:
效果图:
MyImage
public class MyImage extends View { private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Bitmap mBitmap; private float[] matrixArray = new float[20]; public MyImage(Context context, AttributeSet attrs) { super(context, attrs); mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.test); invalidate(); } public void setValues(float[] a) { for (int i = 0; i < 20; i++) { matrixArray = a; } } @Override protected void onDraw(Canvas canvas) { Paint paint = mPaint; paint.setColorFilter(null); canvas.drawBitmap(mBitmap, 0, 0, paint); ColorMatrix colorMatrix = new ColorMatrix(); //设置颜色矩阵 colorMatrix.set(matrixArray); //颜色滤镜,将颜色矩阵应用于图片 paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); //绘图 canvas.drawBitmap(mBitmap, 0, 0, paint); Log.i("ColorMatrixActivity", "--------->onDraw"); } }
ColorMatrixActivity
此处用到了id相似(如:tv0,tv1,tv2…….)的findviewbyid的方法,参考:Android在循环中调用findViewById();
public class ColorMatrixActivity extends Activity { private MyImage myImage; private EditText[] ets = new EditText[20]; private float[] changeColorArray = new float[20]; private float[] matrixArray = { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.color_matrix); myImage = (MyImage) findViewById(R.id.myImage); //初始化 myImage.setValues(matrixArray); myImage.invalidate(); for (int i = 0; i < 20; i++) { int id = getResources().getIdentifier("indexa" + i, "id", getPackageName()); EditText editText = (EditText) findViewById(id); ets[i] = editText; } //通过修改改变颜色滤镜 findViewById(R.id.set_color).setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View arg0) { for (int i = 0; i < 20; i++) { float trim = Float.valueOf(ets[i].getText().toString().trim()); changeColorArray[i] = trim; } myImage.setValues(changeColorArray); myImage.invalidate(); } }); } }
布局:
为了让EditText可以输入负数和小数,使用这个属性:android:inputType=”numberSigned|numberDecimal”<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:orientation="vertical"> <com.android.imooc.MyImage android:id="@+id/myImage" android:layout_width="match_parent" android:layout_height="120dp" /> <!--红色--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="R" android:textColor="#ff4081" android:textSize="16sp" /> <EditText android:id="@+id/indexa0" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="15dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa1" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa2" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa3" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa4" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> </LinearLayout> <!--绿色--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="G" android:textColor="#ff4081" android:textSize="16sp" /> <EditText android:id="@+id/indexa5" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="15dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa6" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa7" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa8" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa9" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> </LinearLayout> <!--蓝色--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="B" android:textColor="#ff4081" android:textSize="16sp" /> <EditText android:id="@+id/indexa10" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="15dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa11" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa12" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa13" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa14" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> </LinearLayout> <!--透明度--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="A" android:textColor="#ff4081" android:textSize="16sp" /> <EditText android:id="@+id/indexa15" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="15dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa16" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa17" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa18" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> <EditText android:id="@+id/indexa19" android:layout_width="0dp" android:layout_height="35dp" android:layout_marginLeft="5dp" android:layout_weight="1" android:background="@drawable/input" android:inputType="numberSigned|numberDecimal" /> </LinearLayout> <!--提交--> <Button android:id="@+id/set_color" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:text="提交" /> </LinearLayout>
drawable/input:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <stroke android:width="2dp" android:color="#0000ff" /> </shape>
相关文章推荐
- 自定义View之RGB颜色变化Paint画笔颜色过滤器setColorFilter,LightingColorFilter光照过滤器
- 自定义控件三部曲之绘图篇(九)——Paint之setColorFilter
- 详解Paint的setColorFilter(ColorFilter filter)
- 利用Paint的 setColorFilter 颜色过滤 来实现按钮被按下的效果
- 自定义控件三部曲之绘图篇(九)——Paint之setColorFilter
- 自定义控件之绘图篇:Paint之setColorFilter
- Android 背景颜色处理[使用 Drawable.setColorFilter(),或者paint.setColorFilter()]
- 详解Paint的setColorFilter(ColorFilter filter)
- Paint之setColorFilter(二)
- 详解Paint的setMaskFilter(MaskFilter maskfilter)
- Android:Paint的setMaskFilter(MaskFilter maskfilter)
- 106、抗锯齿方法paint.setAntiAlias(ture);paint.setFilterBitmap(true))
- Android setColorFilter 滤镜效果
- 抗锯齿方法paint.setAntiAlias(ture);paint.setFilterBitmap(true))
- 详解Paint的setMaskFilter(MaskFilter maskfilter)
- Porter/Duff,图片加遮罩setColorFilter
- setColorFilter滤镜效果
- 抗锯齿方法paint.setAntiAlias(ture);paint.setFilterBitmap(true))
- Android setColorFilter 滤镜效果
- 自定义控件点滴2(setColorFilter)