随時随地閱讀更多技術實戰幹貨,擷取項目源碼、學習資料,請關注源代碼社群公衆号(ydmsq666)、QQ技術交流群(183198395)。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmLzUTN5IjM0EjM3ITMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
顔色矩陣是一個4x 5的矩陣,如下圖:
讓它和顔色分量RGBA相乘去改變RGBA的值
至于矩陣的運算就不多說了。下面給個示例示範ColorMatrix的使用:
MainActivity:
package com.home.colormatrix;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.method.DigitsKeyListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
public class MainActivity extends Activity {
private View view;
private float[] values = new float[20];
private MyView myView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = getView();
setContentView(view);
}
/**
* 得到頁面布局
*
* @return
*/
private View getView() {
// 根布局
RelativeLayout root = new RelativeLayout(this);
LinearLayout.LayoutParams rootlp = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
root.setLayoutParams(rootlp);
// 所有文本框根布局
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
LinearLayout editLayout = new LinearLayout(this);
editLayout.setId(30);
editLayout.setOrientation(LinearLayout.VERTICAL);
root.addView(editLayout, lp);
int index = 1;
for (int i = 0; i < 4; i++) {
// 每一行文本框根布局
LinearLayout layout = new LinearLayout(this);
LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layout.setOrientation(LinearLayout.HORIZONTAL);
editLayout.addView(layout, lp2);
// 每一行的文本框
for (int j = 0; j < 5; j++) {
EditText et = new EditText(this);
LinearLayout.LayoutParams lp3 = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT, 1);
et.setId(index++);
et.setKeyListener(new DigitsKeyListener(false, true));
et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
myView.setValue(getData());
myView.invalidate();
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
layout.addView(et, lp3);
}
}
// 圖檔布局
myView = new MyView(this);
RelativeLayout.LayoutParams viewlp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
viewlp.addRule(RelativeLayout.ABOVE, 30);
root.addView(myView, viewlp);
return root;
}
/**
* 擷取文本框裡面的資料
*
* @return
*/
private float[] getData() {
for (int i = 0; i < 20; i++) {
EditText et = (EditText) view.findViewById(i + 1);
String data = et.getText().toString();
if (data == null || "".equals(data)) {
values[i] = 0;
} else {
values[i] = Float.valueOf(data);
}
}
return values;
}
}
MyView:
package com.home.colormatrix;
import com.home.testcolormatrix.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View {
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Bitmap bitmap;
private float[] array = new float[20];
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context) {
super(context);
bitmap = BitmapFactory.decodeResource(context.getResources(),
R.drawable.test);
invalidate();
}
public void setValue(float[] array) {
for (int i = 0; i < array.length; i++) {
this.array[i] = array[i];
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setColorFilter(null);
canvas.drawBitmap(bitmap, 0, 0, paint);
ColorMatrix cm = new ColorMatrix();
cm.set(array);
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bitmap, 0, 0, paint);
}
}
給activity加上下面屬性可以讓UI和輸入法隔離。
android:windowSoftInputMode="adjustResize"