package com.xjf.repository.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.TextView;
/**
* -----------------------------------------------------------------
* User:xijiufu
* Email:xjfsml@163.com
* Version:1.0
* Time:2016/11/4--11:17
* Function: 添加滤镜的TextView
* ModifyHistory:
* -----------------------------------------------------------------
*/
public class FilterTextView extends TextView {
public FilterTextView(Context context) {
super(context);
}
public FilterTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FilterTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
// 获取TextView的Drawable对象,返回的数组长度应该是4,对应左上右下
Drawable[] drawables = getCompoundDrawables();
if (drawables != null) {
Drawable drawable = drawables[0];
if (drawable != null) {
// 当左边Drawable的不为空时,测量要绘制文本的宽度
float textWidth = getPaint().measureText(getText().toString());
int drawablePadding = getCompoundDrawablePadding();
int drawableWidth = drawable.getIntrinsicWidth();
// 计算总宽度(文本宽度 + drawablePadding + drawableWidth)
float bodyWidth = textWidth + drawablePadding + drawableWidth;
// 移动画布开始绘制的X轴
canvas.translate((getWidth() - bodyWidth) / 2, 0);
} else if ((drawable = drawables[1]) != null) {
// 否则如果上边的Drawable不为空时,获取文本的高度
Rect rect = new Rect();
getPaint().getTextBounds(getText().toString(), 0, getText().toString().length(), rect);
float textHeight = rect.height();
int drawablePadding = getCompoundDrawablePadding();
int drawableHeight = drawable.getIntrinsicHeight();
// 计算总高度(文本高度 + drawablePadding + drawableHeight)
float bodyHeight = textHeight + drawablePadding + drawableHeight;
// 移动画布开始绘制的Y轴
canvas.translate(0, (((getHeight() - bodyHeight) / 2)));
}
}
super.onDraw(canvas);
}
/* @Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
//在按下事件中设置滤镜
setFilter();
break;
case MotionEvent.ACTION_UP:
//由于捕获了Touch事件,需要手动触发Click事件
performClick();
case MotionEvent.ACTION_CANCEL:
//在CANCEL和UP事件中清除滤镜
removeFilter();
break;
default:
break;
}
return true;
}*/
/**
* 移除滤镜
*/
private void removeFilter() {
Drawable[] drawables = getCompoundDrawables();
Drawable drawableTop = drawables[1];//上部
if (drawableTop == null) {
return;
}
//清除滤镜
drawableTop.clearColorFilter();
}
/**
* 设置滤镜
* <p>
* 1.PorterDuff.Mode.CLEAR
* 所绘制不会提交到画布上。
* 2.PorterDuff.Mode.SRC
* 显示上层绘制图片
* 3.PorterDuff.Mode.DST
* 显示下层绘制图片
* 4.PorterDuff.Mode.SRC_OVER
* 正常绘制显示,上下层绘制叠盖。
* 5.PorterDuff.Mode.DST_OVER
* 上下层都显示。下层居上显示。
* 6.PorterDuff.Mode.SRC_IN
* 取两层绘制交集。显示上层。
* 7.PorterDuff.Mode.DST_IN
* 取两层绘制交集。显示下层。
* 8.PorterDuff.Mode.SRC_OUT
* 取上层绘制非交集部分。
* 9.PorterDuff.Mode.DST_OUT
* 取下层绘制非交集部分。
* 10.PorterDuff.Mode.SRC_ATOP
* 取下层非交集部分与上层交集部分
* 11.PorterDuff.Mode.DST_ATOP
* 取上层非交集部分与下层交集部分
* 12.PorterDuff.Mode.XOR
* 异或:去除两图层交集部分
* 13.PorterDuff.Mode.DARKEN
* 取两图层全部区域,交集部分颜色加深
* 14.PorterDuff.Mode.LIGHTEN
* 取两图层全部,点亮交集部分颜色
* 15.PorterDuff.Mode.MULTIPLY
* 取两图层交集部分叠加后颜色
* 16.PorterDuff.Mode.SCREEN
* 取两图层全部区域,交集部分变为透明色
*/
private void setFilter() {
Drawable[] drawables = getCompoundDrawables();
Drawable drawableTop = drawables[1];//上部
if (drawableTop == null) {
return;
}
//设置滤镜
drawableTop.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
}
}
//===========================================================================//
// //
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| -_- |) //
// O\ = /O //
// ____/`---'\____ //
// . ' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . __ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ======`-.____`-.___\_____/___.-`____.-'====== //
// `=---=' //
// //
// ............................................. //
// 佛祖镇楼 BUG辟易 //
// 佛曰: //
// 写字楼里写字间,写字间里程序员; //
// 程序人员写程序,又拿程序换酒钱。 //
// 酒醒只在网上坐,酒醉还来网下眠; //
// 酒醉酒醒日复日,网上网下年复年。 //
// 但愿老死电脑间,不愿鞠躬老板前; //
// 奔驰宝马贵者趣,公交自行程序员。 //
// 别人笑我忒疯癫,我笑自己命太贱; //
// 不见满街漂亮妹,哪个归得程序员? //
//===========================================================================//