天天看點

顔色矩陣ColorMatrix的使用

随時随地閱讀更多技術實戰幹貨,擷取項目源碼、學習資料,請關注源代碼社群公衆号(ydmsq666)、QQ技術交流群(183198395)。

顔色矩陣ColorMatrix的使用
顔色矩陣ColorMatrix的使用
顔色矩陣ColorMatrix的使用

顔色矩陣是一個4x 5的矩陣,如下圖:

顔色矩陣ColorMatrix的使用

讓它和顔色分量RGBA相乘去改變RGBA的值

顔色矩陣ColorMatrix的使用

至于矩陣的運算就不多說了。下面給個示例示範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"