下面列出了怎么用android.graphics.PaintFlagsDrawFilter的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (mChanged && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
post(new Runnable() {
@Override
public void run() {
if (mAttached && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
final int layerType = getLayerType();
// If it's already a hardware layer, it'll be built anyway.
if (layerType != LAYER_TYPE_HARDWARE || mFirst) {
mFirst = false;
setLayerType(LAYER_TYPE_HARDWARE, null);
buildLayer();
setLayerType(LAYER_TYPE_NONE, null);
}
}
}
});
mChanged = false;
}
PaintFlagsDrawFilter pfd = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint
.FILTER_BITMAP_FLAG);
canvas.setDrawFilter(pfd);
}
public WaveView(Context context, AttributeSet attrs) {
super(context, attrs);
//初始化路径
mAbovePath = new Path();
mBelowWavePath = new Path();
//初始化画笔
mAboveWavePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mAboveWavePaint.setAntiAlias(true);
mAboveWavePaint.setStyle(Paint.Style.FILL);
mAboveWavePaint.setColor(Color.WHITE);
mBelowWavePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBelowWavePaint.setAntiAlias(true);
mBelowWavePaint.setStyle(Paint.Style.FILL);
mBelowWavePaint.setColor(Color.WHITE);
mBelowWavePaint.setAlpha(80);
//画布抗锯齿
mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
}
private void init() {
Log.i(Tag, "init");
mLineWidth = changeDp(1);
mLineHeight = changeDp(3);
mFixLineHeight = changeDp(6);
mSunRadius = changeDp(12);
mLineColor = Color.RED;
mLineLevel = 30;
//线的配置
mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mLinePaint.setColor(mLineColor);
mLinePaint.setStyle(Paint.Style.FILL_AND_STROKE);
// 设置画笔宽度
mLinePaint.setStrokeWidth(mLineWidth);
mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
| Paint.FILTER_BITMAP_FLAG);
debugRect = new Rect();
mouthRect = new RectF();
}
private void init() {
Log.i(Tag, "init");
mLineWidth = changeDp(1);
mLineHeight = changeDp(3);
mFixLineHeight = changeDp(6);
mSunRadius = changeDp(12);
mLineColor = Color.RED;
mLineLevel = 30;
//线的配置
mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mLinePaint.setColor(mLineColor);
mLinePaint.setStyle(Paint.Style.FILL_AND_STROKE);
// 设置画笔宽度
mLinePaint.setStrokeWidth(mLineWidth);
mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
| Paint.FILTER_BITMAP_FLAG);
debugRect = new Rect();
mouthRect = new RectF();
}
private void init(Context context) {
// Paint paint = new Paint();
// // 透明度: 00%=FF(不透明) 100%=00(透明)
// paint.setColor(Color.WHITE);
// paint.setStyle(Paint.Style.STROKE);
// // 解决图片拉伸后出现锯齿的两种办法: 1.画笔上设置抗锯齿 2.画布上设置抗锯齿
// // http://labs.easymobi.cn/?p=3819
// paint.setFlags(Paint.ANTI_ALIAS_FLAG);
// paint.setAntiAlias(true); //设置线条等图形的抗锯齿
int clearBits = 0;
int setBits = Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG;
pfdf = new PaintFlagsDrawFilter(clearBits, setBits);
//由于imageview有默认底色,如黑色,设置背景为透明是为了第一次setImageBitmap时不显示圆以外方型的默认背景色
//但是这样在中兴nubia手机上还会首先显示正方形黑色背景,然后才变圆(解决办法,先裁成圆再setImageBitmap)
setBackgroundColor(context.getResources().getColor(android.R.color.transparent));
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mBgColor);
mPaint.setAntiAlias(true);//抗锯齿
Rect rect = new Rect(0, 0, mWidth, mHeight - mArcHeight);
canvas.drawRect(rect, mPaint);
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
Path path = new Path();
path.moveTo(0, mHeight - mArcHeight);
path.quadTo(mWidth / 2, mHeight, mWidth, mHeight - mArcHeight);
canvas.drawPath(path, mPaint);
}
private void init() {
Log.i(Tag, "init");
mLineWidth = changeDp(1);
mLineHeight = changeDp(3);
mFixLineHeight = changeDp(6);
mSunRadius = changeDp(12);
mLineColor = Color.RED;
mLineLevel = 30;
//线的配置
mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mLinePaint.setColor(mLineColor);
mLinePaint.setStyle(Paint.Style.FILL_AND_STROKE);
// 设置画笔宽度
mLinePaint.setStrokeWidth(mLineWidth);
mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
| Paint.FILTER_BITMAP_FLAG);
debugRect = new Rect();
mouthRect = new RectF();
}
private void init() {
// paint = new Paint(Paint.ANTI_ALIAS_FLAG);
// Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
// paint.setXfermode(xfermode);
// paint.setStrokeWidth(50);
// paint.setColor(0x000000);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(0xFF303F9F);
paint.setStrokeWidth(50);
path = new Path();
paintFlagsDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
// setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (mChanged && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
post(new Runnable() {
@Override
public void run() {
if (mAttached && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
final int layerType = getLayerType();
// If it's already a hardware layer, it'll be built anyway.
if (layerType != LAYER_TYPE_HARDWARE || mFirst) {
mFirst = false;
setLayerType(LAYER_TYPE_HARDWARE, null);
buildLayer();
setLayerType(LAYER_TYPE_NONE, null);
}
}
}
});
mChanged = false;
}
PaintFlagsDrawFilter pfd = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint
.FILTER_BITMAP_FLAG);
canvas.setDrawFilter(pfd);
}
public void onDraw(Canvas canvas) {
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, 3));
int W = canvas.getWidth();
int H = canvas.getHeight();
Rect frame = CameraManager.get().getFramingRect();
if (frame != null) {
drawCover(canvas, frame, W, H);
if (this.resultBitmap != null) {
canvas.drawBitmap(this.resultBitmap, (float) frame.left, (float) frame.top, this.paint);
return;
}
drawScanningLine(canvas, frame);
drawRectEdge(canvas, frame);
this.paint.reset();
postInvalidateDelayed(ANIMATION_DELAY);
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
// TODO: 2017/7/8 padding
canvas.translate(mProgressHeadRadius * 2, mProgressHeadRadius * 2);
// TODO: 2017/7/8 画进度条
draProgressArc(canvas);
// TODO: 2017/7/8 移坐标到圆心
canvas.translate(arcRadius, arcRadius);
// TODO: 2017/7/8 计算圆心半径到圆周上的某个点坐标
Coordinate coordinate = center2Point(angle - 90, arcRadius);
float cx = coordinate.x; //绘制原点起始坐标x
float cy = coordinate.y;
// TODO: 2017/7/8 绘制 小圆点
draHead(canvas, cx, cy);
// TODO: 2017/7/8 绘制 小圆点上的文字
draHeadText(canvas, cx, cy);
}
public RoundImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RoundImageView);
float mRadius = array.getDimension(R.styleable.RoundImageView_radius, 10);
rids[0] = mRadius;
rids[1] = mRadius;
rids[2] = mRadius;
rids[3] = mRadius;
rids[4] = 0f;
rids[5] = 0f;
rids[6] = 0f;
rids[7] = 0f;
array.recycle();
mPath = new Path();
paintFlagsDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
private void init() {
Log.i(Tag, "init");
mLineWidth = changeDp(1);
mLineHeight = changeDp(3);
mFixLineHeight = changeDp(6);
mSunRadius = changeDp(12);
mLineColor = Color.RED;
mLineLevel = 30;
//线的配置
mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mLinePaint.setColor(mLineColor);
mLinePaint.setStyle(Paint.Style.FILL_AND_STROKE);
// 设置画笔宽度
mLinePaint.setStrokeWidth(mLineWidth);
mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
| Paint.FILTER_BITMAP_FLAG);
debugRect = new Rect();
mouthRect = new RectF();
}
private void drawTargetBitmap(Canvas canvas,int alpha) {
// mCanvas =canvas;
mPaint = new Paint();
mPaint.setColor(mSelectedColor);
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setAlpha(alpha);
mCanvas.drawRect(mIconRect, mPaint);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
mPaint.setAlpha(255);
mCanvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
if (mIconBitmapSelected != null)
mCanvas.drawBitmap(mIconBitmapSelected, mIconRect.left, mIconRect.top, mPaint);
else
mCanvas.drawBitmap(mIconBitmapNormal, mIconRect.left, mIconRect.top, mPaint);
canvas.drawBitmap(mBitmap, 0, 0, null);
}
private void init() {
Log.i(Tag, "init");
mLineWidth = changeDp(1);
mLineHeight = changeDp(3);
mFixLineHeight = changeDp(6);
mSunRadius = changeDp(12);
mLineColor = Color.RED;
mLineLevel = 30;
//线的配置
mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mLinePaint.setColor(mLineColor);
mLinePaint.setStyle(Paint.Style.FILL_AND_STROKE);
// 设置画笔宽度
mLinePaint.setStrokeWidth(mLineWidth);
mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
| Paint.FILTER_BITMAP_FLAG);
debugRect = new Rect();
mouthRect = new RectF();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));//抗锯齿
if (mAnimator_visible.isRunning()) {
int x = (int) mAnimator_visible.getAnimatedValue();
drawClear(x,canvas);
invalidate();
}else if (isVisible){
drawClear(0,canvas);
}
if(mAnimator_gone.isRunning()){
float scale = (float) mAnimator_gone.getAnimatedValue();
drawClearGone(scale, canvas);
invalidate();
}
}
protected void init() {
bgPaint = new Paint();
bgPaint.setAntiAlias(true);
bgPaint.setColor(backgroundColor);
focusPaint = new Paint();
focusPaint.setAntiAlias(true);
focusPaint.setColor(focusColor);
animatorSet = new AnimatorSet();
bgRectF = new RectF();
mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
this.setBackgroundResource(0);
}
private void init() {
defaultPaint = new Paint();
defaultPaint.setAntiAlias(true);
defaultPaint.setColor(defaultBgColor);
focusPaint = new Paint();
focusPaint.setAntiAlias(true);
focusPaint.setColor(focusBgcolor);
icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_action_new);
getIconParams();
mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
this.setBackgroundResource(0);
}
@Override
protected final void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);//
this.mRect.left = ((getWidth() - this.mAvatarSize) / 2);
this.mRect.right = ((getWidth() + this.mAvatarSize) / 2);
this.mRect.top = ((getHeight() - this.mAvatarSize) / 2);
this.mRect.bottom = ((getHeight() + this.mAvatarSize) / 2);
rectArray[0].set(0, 0, mRect.left, mRect.top);
rectArray[1].set(mRect.left, 0, mRect.right, this.mRect.top);
rectArray[2].set(this.mRect.right, 0, getWidth(), this.mRect.top);
rectArray[3].set(0, mRect.top, mRect.left, this.mRect.bottom);
rectArray[4].set(mRect.right, mRect.top, getWidth(), this.mRect.bottom);
rectArray[5].set(0, mRect.bottom, this.mRect.left, getHeight());
rectArray[6].set(mRect.left, mRect.bottom, this.mRect.right, getHeight());
rectArray[7].set(mRect.right, mRect.bottom, getWidth(), getHeight());
this.mPaint.setColor(0x7f000000);
this.mPaint.setStyle(Paint.Style.FILL);
for (Rect rect : rectArray) {
canvas.drawRect(rect, this.mPaint);
}
mPaint.reset();
if (!centerBitmap.isRecycled()) {
canvas.drawBitmap(centerBitmap, centerRect, mRect, mPaint);
} else {
Log.i(TAG, "bitmap recycle");
}
//centerBitmap.recycle();
}
public IconUtilities(Context context) {
final Resources resources = context.getResources();
DisplayMetrics metrics = mDisplayMetrics = resources.getDisplayMetrics();
final float density = metrics.density;
final float blurPx = 5 * density;
mIconWidth = mIconHeight = (int) resources.getDimension(android.R.dimen.app_icon_size);
mIconTextureWidth = mIconTextureHeight = mIconWidth + (int)(blurPx*2);
mCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG,
Paint.FILTER_BITMAP_FLAG));
}
public IconResizer() {
mCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG,
Paint.FILTER_BITMAP_FLAG));
final Resources resources = LauncherActivity.this.getResources();
mIconWidth = mIconHeight = (int) resources.getDimension(
android.R.dimen.app_icon_size);
}
/**
* 从图片加载到另一张图片
*
* @param bitmap
* @param bitmap_src
* @return
*/
public static Bitmap loadFromBitmap(Bitmap bitmap, Bitmap bitmap_src, boolean clearBmp) {
if (clearBmp)
bitmap.eraseColor(Color.TRANSPARENT);
// bitmap_src = zoomBitmap(bitmap_src, bitmap.getWidth(), bitmap.getHeight());
// loadFromBytes(bitmap, getBytes(bitmap_src));
Canvas canvas = new Canvas(bitmap);
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
float rw = (float) bitmap.getWidth() / bitmap_src.getWidth();
float rh = (float) bitmap.getHeight() / bitmap_src.getHeight();
canvas.scale(rw, rh);
canvas.drawBitmap(bitmap_src, 0, 0, null);
return bitmap;
}
public CircleTextView(Context context, AttributeSet attrs){
super(context, attrs);
PAINT = new Paint();
FILTER = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
PAINT.setColor(Color.RED);
PAINT.setAntiAlias(true);
}
private void drawRing(Canvas canvas) {
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
float ringWidth = ColorPickConstants.PIX_INTERVAL * 2 + 4;
mRingPaint.setStrokeWidth(ringWidth);
canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2 - ringWidth / 2, mRingPaint);
mRingPaint.setColor(getResources().getColor(R.color.dk_color_333333));
mRingPaint.setStrokeWidth(0.5f);
canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2, mRingPaint);
canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2 - ringWidth, mRingPaint);
}
public IconResizer(int width, int height, DisplayMetrics metrics) {
mCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG,
Paint.FILTER_BITMAP_FLAG));
mMetrics = metrics;
mIconWidth = width;
mIconHeight = height;
}
/**
* @param canvas
*/
private void drawTask(Canvas canvas) {
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
todos = dayInfo.todos;
if (dayInfo != null && dayInfo.dayType == DayType.DAY_TYPE_NOW && todos != null && todos.size() > 0) {
mPaint.setAntiAlias(true);// 消除锯齿
mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); // 消除锯齿
mPaint.setTextSize(10 * mDisplayMetrics.scaledDensity);
taskHeight = getStringHeight(mPaint, "");
for (int i = 0; i < todos.size() && i < 3; i++) {
drawTaskRect(canvas, height - (i + 1) * taskHeight, i);
}
for (int i = 0; i < todos.size() && i < 3; i++) {
if (i == 0) {
setMonthTaskTitle(canvas, i, 4);
} else if (i == 1) {
setMonthTaskTitle(canvas, i, 5);
} else if (i == 2) {
setMonthTaskTitle(canvas, i, 6);
}
}
}
}
private Bitmap getMaskBitmap(Bitmap mBitmap, Path mask) {
//以控件宽高 create一块bitmap
Bitmap tempBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
Log.e(TAG, " getMaskBitmap: width:" + mBitmap.getWidth() + ", height:" + mBitmap.getHeight());
Log.e(TAG, " View: width:" + mWidth + ", height:" + mHeight);
//把创建的bitmap作为画板
Canvas mCanvas = new Canvas(tempBitmap);
//有锯齿 且无法解决,所以换成XFermode的方法做
//mCanvas.clipPath(mask);
// 抗锯齿
mCanvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
//绘制用于遮罩的圆形
mCanvas.drawPath(mask, mMaskPaint);
//设置遮罩模式(图像混合模式)
mMaskPaint.setXfermode(mPorterDuffXfermode);
// mMaskPaint.setShadowLayer(5, 3, 3, 0xFF0000FF);
// 设置光源的方向
float[] direction = new float[]{ 1, 1, 1 };
//设置环境光亮度
float light = 1f;
// 选择要应用的反射等级
float specular = 6;
// 向mask应用一定级别的模糊
float blur = 3.5f;
// EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);
BlurMaskFilter maskFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID);
// 应用mask
mMaskPaint.setMaskFilter(maskFilter);
//★考虑到scaleType等因素,要用Matrix对Bitmap进行缩放
mCanvas.drawBitmap(mBitmap, getImageMatrix(), mMaskPaint);
mMaskPaint.setXfermode(null);
return tempBitmap;
}
/**
* 初始化Paint
*/
protected void initCanvasInfo() {
pfdf = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
| Paint.FILTER_BITMAP_FLAG);
paint = new Paint();
paint.setAntiAlias(true);
matrix = new Matrix();
matrix.setRotate(5);
}
public BrushDrawable(final int type, final int width, final int height, final int clearflags, final int setFlags) {
super();
mPaint = new Paint();
mDrawFilter = new PaintFlagsDrawFilter(clearflags, setFlags);
mClearXfermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
init(100, 100);
setType(type, width, height);
}
/**
* 创建裁剪的背景图片
*
* @param paint
* @param path
* @param bitmap
* @return
*/
private Bitmap creatBitmap(Paint paint, Path path, Bitmap bitmap) {
Canvas newCanvas = new Canvas(bitmap);
newCanvas.setDrawFilter(new PaintFlagsDrawFilter(0,
Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
newCanvas.clipPath(path, Region.Op.INTERSECT);
newCanvas.drawBitmap(mGradientLine, 0, 0, paint);
return bitmap;
}