自定义控件

Paint 画笔

//禁用硬件加速
setLayerType(LAYER_TYPE_SOFTWARE,null);
paint = new Paint();
//设置颜色
paint.setColor(Color.RED);
// 设置填充样式 STROKE 描边 FILL 填充 FILL_AND_STROKE 填充和描边
paint.setStyle(Paint.Style.FILL_AND_STROKE);
//设置画笔的宽度
paint.setStrokeWidth(50);
//设置抗锯齿
paint.setAntiAlias(true);
//设置透明度 0 -255
paint.setAlpha(12);
//设置路径样式 圆形拐角 虚线 离散 印章 合并
paint.setPathEffect(new CornerPathEffect(4));
//笔帽样式 BUTT 无笔帽 ROUND圆形 SQUARE 方形
paint.setStrokeCap(Paint.Cap.SQUARE);
//设置路径的转角样式BEVEL 直线 MITER 锐角 ROUND圆弧
paint.setStrokeJoin(Paint.Join.ROUND);
//设置绘制图像时的抗抖动效果 两个颜色的过度色
paint.setDither(true);
//字体相关
//设置文字的大小
paint.setTextSize(25);
//设置字体是否为粗体
paint.setFakeBoldText(true);
//设置字体是否为删除线
paint.setStrikeThruText(true);
//设置字体是否为下划线
paint.setUnderlineText(true);
//设置文字的对齐方式LEFT RIGHT CENTER
paint.setTextAlign(Paint.Align.CENTER);
//水平拉伸
paint.setTextScaleX(1);
//设置字体样式
paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
//设置是否打开线性文本标识
paint.setLinearText(true);
//设置阴影
//radius 模糊半径 dx 正值向右偏移 负值向左偏移
//dy 阴影纵向偏移 正值向下偏移 负值向上偏移
//shadowColor 阴影的颜色 对图片阴影无效
paint.setShadowLayer(float radius, float dx, float dy, int shadowColor)
    
//清除阴影
paint.clearShadowLayer();    
  
//发光效果
//BlurMaskFilter
//radius 模糊半径
//INNER 内发光 SOLID外发光 NORMAL内外发光  OUTER仅显示发光效果
BlurMaskFilter filter = new BlurMaskFilter(50, BlurMaskFilter.Blur.OUTER);
paint.setMaskFilter(filter);

//获取文字的高度
int baseLineY = 10;
Paint.FontMetricsInt fm = paint.getFontMetricsInt();
int top = baseLineY + fm.top;
int bottom = baseLineY + fm.bottom;
int height = bottom - top;
//获取文字的宽度
float widthTxt = paint.measureText("hi");
    

Path

二阶贝塞尔曲线

请百度搜索 公式 已经效果

//(x1,y1) 是控制点坐标 (x2,y2) 是终点坐标 
//起点 是 path.moveTo(x0,y0)
public void quadTo(float x1, float y1, float x2, float y2)
    
//有点类似相对的意思
// 例如 第一个坐标为 300,400     rQuadTo(100, -100, 200, 100)
//控制点坐标 300+100,400 -100
//终点坐标  300+200,400+100    
public void rQuadTo(float dx1, float dy1, float dx2, float dy2)    

Shader 着色器

BitmapShader

//有点类似ps中的印章工具
//bitmap 用来指定的图片
//tileX CLAMP 用于边缘色彩填充多余的空间
//REPEAT 重复原来的图填充多余空间
//MIRROR 重复使用镜像图来填充多余空间
public BitmapShader(Bitmap bitmap, TileMode tileX,  TileMode tileY)

LinearGradient


//(x0,y0) 渐变的起始点
//(x1,y1) 渐变的结束点
//color0 渐变的起始色
//color1 渐变的结束色
//tile 与BitmapShader 一样
public LinearGradient(float x0, float y0, float x1, float y1,
         int color0, int color1,
        TileMode tile)

RadialGradient

//反射渐变
//centerX,centerY 渐变的中心点
//radius 半径
//centerColor 渐变的起始颜色
//edgeColor 渐变的结束颜色
//tile 与BitmapShader 一样
public RadialGradient(float centerX, float centerY, float radius,
         int centerColor, int edgeColor, TileMode tileMode)

混合模式 PorterDuffXfermode

Xfermode 它能将两张图片无缝结合 请参考ps

//目标图像  DST
//源图像   SRC
// Xfermode 在使用时为了保险期间需要做两件事
setLayerType(View.LAYER_TYPE_SOFTWARE,null);
//新建图层
int layerId = canvas.saveLayer(0,0,getWidth(),getHeight(),null,Canvas.ALL_SAVE_FLAG);
//核心代码
Bitmap dstBmp = null;
Bitmap srcBmp = null;
canvas.drawBitmap(dstBmp,0,0,null);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(srcBmp,100,100,null);
paint.setXfermode(null);
//还原图层
canvas.restoreToCount(layerId);

//颜色叠加相关模式
//PorterDuff.Mode.SRC_IN 
//PorterDuff.Mode.ADD 饱和度相加
//PorterDuff.Mode.LIGHTEN 变亮
//PorterDuff.Mode.DARKEN 变暗
//PorterDuff.Mode.MULTIPLY 正片叠底
//PorterDuff.Mode.OVERLAY 叠加
//PorterDuff.Mode.SCREEN 滤色

AvoidXfermode

//Xfermode   PorterDuffXfermode  
public Xfermode setXfermode(Xfermode xfermode)
// Xfermode 在使用时为了保险期间需要做两件事
setLayerType(View.LAYER_TYPE_SOFTWARE,null);
//新建图层
int layerId = canvas.saveLayer(0,0,getWidth(),getHeight(),null,Canvas.ALL_SAVE_FLAG);
//核心代码
//还原图层
canvas.restoreToCount(layerId);

Canvas 图层

获取Canvas 的方法

第一种方式:

View 重写 onDraw()

ViewGroup 重写 dispatchDraw()

无论是view 还是viewGroup 绘制顺序都是 onDraw->dispatchDraw

第二种方式:

Canvas canvas = new Canvas(bitmap)

第三中方式

SurfaceHolder.lockCanvas()

创建图层

参考 ps中的图层概念 一样的道理

canvas.save();

public int saveLayer(float left, float top, float right, float bottom,  Paint paint,
       int saveFlags)
public int saveLayerAlpha( RectF bounds, int alpha, int saveFlags)   
    
    

画布

ShapeDrawable

//ArcShape 扇行
//OvalShadow 椭圆形
//PathShape 路径
//RoundRectShape 圆角矩形
//RectShape 矩形
public ShapeDrawable(Shape s)
    
//使用例子    
ShapeDrawable shapeDrawable = new ShapeDrawable(new RectShape());
shapeDrawable.setBounds(new Rect(50,50,200,100));
shapeDrawable.getPaint().setColor(Color.YELLOW);
shapeDrawable.draw(canvas);    

//常用函数
setBounds //指定当前ShapeDrawable 在当前控件的显示位置
getPaint // 获取ShapeDrawable 画笔
setAlpha  //透明度 0-255    
setColorFilter //颜色过滤
setIntrinsicWidth //设置默认宽度 默认为 -1px
setPadding // 设置内边距    

自定义Drawable

自定义类要继承Drawable

public class CustomDrawable extends Drawable {
    @Override
    public void draw( Canvas canvas) {
        
    }

    @Override
    public void setAlpha(int alpha) {

    }

    @Override
    public void setColorFilter(int color,  PorterDuff.Mode mode) {
        super.setColorFilter(color, mode);
    }

    @Override
    public void setColorFilter( ColorFilter colorFilter) {

    }

    @Override
    public int getOpacity() {
        //PixelFormat.UNKNOWN   未知的
        //PixelFormat.TRANSLUCENT 半透明
        //PixelFormat.TRANSPARENT  透明
        //PixelFormat.OPAQUE 不透明
        return PixelFormat.OPAQUE;
    }
}

圆角Drawable

public class CustomDrawable extends Drawable {


    private BitmapShader bitmapShader;
    private RectF mBound;
    private Bitmap mBitmap;
    private Paint mPaint;
    public  CustomDrawable(Bitmap bitmap){
        mBitmap = bitmap;
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
    }

    @Override
    public void draw( Canvas canvas) {
        canvas.drawRoundRect(mBound,20,20,mPaint);
    }

    @Override
    public void setAlpha(int alpha) {
        mPaint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter( ColorFilter colorFilter) {
        mPaint.setColorFilter(colorFilter);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }

    @Override
    public void setBounds(int left, int top, int right, int bottom) {
        super.setBounds(left, top, right, bottom);
        Bitmap bitmap = Bitmap.createScaledBitmap(mBitmap,right-left,bottom-top,true);
        bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        mPaint.setShader(bitmapShader);
        mBound = new RectF(left,top,right,bottom);

    }

    @Override
    public int getIntrinsicWidth() {
        return mBitmap.getWidth();
    }

    @Override
    public int getIntrinsicHeight() {
        return mBitmap.getHeight();
    }
}

自定义Drawable 类似与view 没有交互功能

Bitmap

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值