此次实验主要通过Android中的方法获取输入的颜色矩阵的值,更改后赋值给图片中的颜色矩阵更改图片效果。具体的布局的方法跟笔记1种差不多,只不过这里要添加一个供用户输入的GridView
1 <GridLayout 2 android:id="@+id/group" 3 android:layout_width="match_parent" 4 android:layout_height="0dp" 5 android:layout_weight="3" 6 android:rowCount="4" 7 android:columnCount="5"> 8 9 </GridLayout>
同时定义两个Button分别实现更改和重置功能,定义ImageView展示图片。
新建colorMatrix类,实现对颜色矩阵的相关操作。
首先,在创建方法中显示原图,并对相应的组建进行初始化操作。
1 bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher); 2 mImageView = (ImageView) findViewById(R.id.imageView); 3 mGroup = (GridLayout) findViewById(R.id.group); 4 mImageView.setImageBitmap(bitmap);
在oncreate方法中不能获得控件的宽和高,所以需要使用post方法
1 mGroup.post(new Runnable() { 2 3 @Override 4 public void run() { 5 // TODO Auto-generated method stub 6 mEtWidth = mGroup.getWidth() / 5; 7 mEtHeight = mGroup.getHeight() / 4; 8 addEts(); 9 matrixInit(); 10 } 11 });
这样在控件绘制完毕之后执行Runnable方法获得控件的高和宽。这里由于是颜色矩阵是一个4行5列的矩阵,所以,需要得到每个editText的宽和高,最后使用一个循环进行添加editText操作。
1 private void addEts() { 2 for (int i = 0; i < 20; i++) { 3 EditText editText = new EditText(colorMatrix.this); 4 mEts[i] = editText; 5 mGroup.addView(editText, mEtWidth, mEtHeight); 6 } 7 }
1 private void matrixInit() { 2 for (int i = 0; i < 20; i++) { 3 if (i % 6 == 0) { 4 mEts[i].setText(String.valueOf(1)); 5 } else { 6 mEts[i].setText(String.valueOf(0)); 7 } 8 } 9 }
添加完成后,我们需要对矩阵进行初始化操作,这里就要用到颜色矩阵的相关知识。
颜色矩阵4行5列,初始状态如图。
从上到下四行分别控制R,G,B,A,第5列可以在原有基础上增减相应的值,类似于前面的方阵是系数矩阵成倍进行调整,后面是一个常数项进行微调。
添加editText操纵和初始化操作结束之后,我们就得到了初始界面。以上就结束了onCreate方法中的相关创建操作。
下面我们就要实现如何通过editText中的值实现对颜色矩阵的更改进而更改图片。
首先我们要获取输入的editText中的值存入数组中。
public void getMatrix() { for (int i = 0; i < 20; i++) { mColorMatrix[i] = Float.valueOf(mEts[i].getText().toString()); } }
获得值后,就要更改图片的颜色矩阵,笔记1中已经讲到,我们是不能对传入的bitmap进行直接修改的,需要得到它的一个复制,因此,我们实际上是在画布上画修改后的复制。
我们通过ColorMatrix的set方法,将数组转化为颜色矩阵,,然后使用画笔将颜色矩阵画入画布即可。
1 private void setImageMatrix() { 2 Bitmap bmp = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), 3 Bitmap.Config.ARGB_8888); 4 android.graphics.ColorMatrix colorMatrix = new android.graphics.ColorMatrix(); 5 colorMatrix.set(mColorMatrix); // 将数组传递进来使其变为颜色矩阵 6 7 Canvas canvas = new Canvas(bmp); 8 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿 9 10 paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); 11 canvas.drawBitmap(bitmap, 0, 0, paint); 12 mImageView.setImageBitmap(bmp); 13 }
最后实现Button的点击事件,改变图片时,我们需要首先获取颜色矩阵,然后将颜色矩阵作用在图片上输出即可。
reset时,同样要重置颜色矩阵,作用在图片上,在这里,getMatrix相当于是一个桥梁,将用户界面的输入和程序对图片的处理联系起来。
1 public void btnChange(View view) { 2 getMatrix(); 3 setImageMatrix(); 4 } 5 6 public void btnReset(View view) { 7 matrixInit(); 8 getMatrix(); 9 setImageMatrix(); 10 }
最后不要忘记在main_Activity中启动相关的类,并且在配置文件中对新建的Activity进行登记。
至此,仿照慕课上的关于颜色矩阵的程序已经完成,思路还算比较清晰,在测试中遇到了一个小问题,测试的手机比较老了(安卓2.3)因此,在初始化界面的时候,颜色矩阵的输入界面总是显示不全,换了高版本的成功运行了。开发中要考虑不同的运行环境。