package com.wuxiaolong.androidsamples.paintcanvas;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ComposePathEffect;
import android.graphics.CornerPathEffect;
import android.graphics.DashPathEffect;
import android.graphics.DiscretePathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathDashPathEffect;
import android.graphics.PathEffect;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.SumPathEffect;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import com.wuxiaolong.androidsamples.R;
/**
* Created by Administrator
* on 2015/12/6 0006.
*/
public class PaintView extends View {
private Paint mPaint;
// 图形混合模式
private PorterDuffXfermode porterDuffXfermode;
private Context mContext;
private Bitmap mBitmap;
private RectF mRectF;
private Shader mShader, bitmapShader, linearGradient, composeShader;
// 路径对象
private Path mPath;
private PathEffect[] pathEffects = new PathEffect[7];
private float mPhase = 5;
public PaintView(Context context) {
super(context);
this.mContext = context;
init();
}
public PaintView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
init();
}
public PaintView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
init();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public PaintView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
this.mContext = context;
init();
}
private void init() {
mBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.logo);
//mShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//mShader = new LinearGradient(0, 0, 500, 500, Color.BLUE, Color.GREEN, Shader.TileMode.CLAMP);
//mShader = new RadialGradient(500, 500, 400, Color.BLUE, Color.GREEN, Shader.TileMode.CLAMP);
//mShader = new SweepGradient(500, 500, Color.BLUE, Color.GREEN);
//bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
//linearGradient = new LinearGradient(0, 0, mBitmap.getWidth(), mBitmap.getHeight(), Color.BLUE, Color.GREEN, Shader.TileMode.CLAMP);
//bitmapShader对应下层图形,linearGradient对应上层图形,像素颜色混合采用MULTIPLY模式
//composeShader = new ComposeShader(bitmapShader, linearGradient, PorterDuff.Mode.MULTIPLY);
//mRectF = new RectF(0, 0, 600, 400);
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(10);
mPaint.setAntiAlias(true);
mPaint.setTextSize(60);
//mPaint.setColor(Color.WHITE);
//mPaint.setShadowLayer(10, 100, 100, Color.BLUE);
//mPaint.setStrikeThruText(true);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeMiter(20f);
mPaint.setSubpixelText(true);
mPaint.setTextAlign(Paint.Align.LEFT);
mPaint.setTextScaleX(1.1f);
mPaint.setTextSkewX(-1f);
mPaint.setFilterBitmap(true);
mPaint.setHinting(Paint.HINTING_ON);
//mPaint.setLinearText(false);
// 设置画笔模糊阴影效果,参数1:模糊延伸半径,必须>0;
// 参数2:有四种枚举
// NORMAL,同时绘制图形本身内容+内阴影+外阴影,正常阴影效果
// INNER,绘制图形内容本身+内阴影,不绘制外阴影
// OUTER,不绘制图形内容以及内阴影,只绘制外阴影
// SOLID,只绘制外阴影和图形内容本身,不绘制内阴影
// BlurMaskFilter绘制的Bitmap基本完全不受影响
//mPaint.setMaskFilter(new BlurMaskFilter(20f, BlurMaskFilter.Blur.SOLID));
//Paint的setMaskFilter不被GPU支持,为了确保画笔的setMaskFilter能供起效,我们需要禁用掉GPU硬件加速
//if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// //View从API Level 11才加入setLayerType方法
// //设置myView以软件渲染模式绘图
// this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
//}
//设置浮雕滤镜效果,参数1:光源指定方向;参数2:环境光亮度,取值0-1,值越小越暗;参数3:镜面高光反射系数,值越小反射越强;参数4:模糊延伸半径
//mPaint.setMaskFilter(new EmbossMaskFilter(new float[]{1, 1, 1}, 0.4f, 8f, 3f));
//initPath();
// 生成色彩矩阵
//ColorMatrix colorMatrix = new ColorMatrix(new float[]{
// 0.5F, 0, 0, 0, 0,
// 0, 0.5F, 0, 0, 0,
// 0, 0, 0.5F, 0, 0,
// 0, 0, 0, 1, 0,
//});
//mPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
// 设置颜色过滤,去掉绿色
//mPaint.setColorFilter(new LightingColorFilter(0xFFFF00FF, 0x00000000));
// 设置颜色过滤,Color的值设为红色,模式PorterDuff.Mode.DARKEN变暗
//mPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.DARKEN));
// 实例化混合模式
//porterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC);
}
private void initPath() {
// 实例化路径
mPath = new Path();
// 定义路径的起点
mPath.moveTo(10, 50);
// 定义路径的各个点
for (int i = 0; i <= 30; i++) {
mPath.lineTo(i * 35, (float) (Math.random() * 100));
}
//什么都不处理
pathEffects[0] = null;
//参数1:线段之间的圆滑程度
pathEffects[1] = new CornerPathEffect(10);
//参数1:间隔线条长度(length>=2),如float[] {20, 10}的偶数参数20定义了我们第一条实线的长度,
//而奇数参数10则表示第一条虚线的长度,后面不再有数据则重复第一个数以此往复循环;参数2:虚实线间距
pathEffects[2] = new DashPathEffect(new float[]{20, 10}, mPhase);
//参数1:值越小杂点越密集;参数2:杂点突出的大小,值越大突出的距离越大
pathEffects[3] = new DiscretePathEffect(5.0f, 10.0f);
Path path = new Path();
path.addRect(0, 0, 8, 8, Path.Direction.CCW);
//参数1:path;参数2:实线的长度;参数3:虚实线间距
pathEffects[4] = new PathDashPathEffect(path, 20, mPhase, PathDashPathEffect.Style.ROTATE);
pathEffects[5] = new ComposePathEffect(pathEffects[2], pathEffects[4]);
//ComposePathEffect和SumPathEffect都可以用来组合两种路径效果,具体区别(不知道如何描述)小伙伴们自己试试
pathEffects[6] = new SumPathEffect(pathEffects[4], pathEffects[3]);
}
@Override
protected void onDraw(Canvas canvas) {
//int canvasWidth = canvas.getWidth();
//int canvasHeight = canvas.getHeight();
//新建一个layer,放置在canvas默认layer的上部,产生的layer初始时是完全透明的
//int layerId = canvas.saveLayer(0, 0, canvasWidth, canvasHeight, null, Canvas.ALL_SAVE_FLAG);
//dst是先画的图形
canvas.drawBitmap(mBitmap, 0, 0, mPaint);
//设置混合模式
//mPaint.setXfermode(porterDuffXfermode);
//src是后画的图形
//mPaint.setColor(0xFFFFCC44);
//canvas.drawCircle(600, 600, 200, mPaint);
//还原混合模式
//mPaint.setXfermode(null);
//或canvas.restore()把这个layer绘制到canvas默认的layer上去
//canvas.restoreToCount(layerId);
//mPaint.setShader(composeShader);
//canvas.drawCircle(500, 550, 400, mPaint);
/*
* 绘制路径
*/
//for (int i = 0; i < pathEffects.length; i++) {
// mPaint.setPathEffect(pathEffects[i]);
// canvas.drawPath(mPath, mPaint);
//
// // 每绘制一条将画布向下平移250个像素
// canvas.translate(0, 250);
//}
canvas.drawText("微信公众号:吴小龙同学", 20, 500, mPaint);
//canvas.drawRect(100, 100, 500, 500, mPaint);
}
}