zoukankan      html  css  js  c++  java
  • 动态给组件添加背景,一半圆角

    尊重劳动成果,转载请标明出处:http://www.cnblogs.com/tangZH/p/8305063.html 

    我们在自定义view的时候有时候需要给组件一个背景,而这个背景可能是不规则的,比如一个红色背景,但是左边有圆角,右边没有,那么应该怎么做呢?在这里我以textView为例。

    用xml的方式很容易实现,不过我们这里是在代码中动态实现的。

    先放上效果图:

    一开始的思路是直接在TextView上面绘制,但是这样会出现一种情况,就是绘制完之后,字体就看不到了,所以我们还是得从背景入手,通过setBackgroundDrawable()方法给它一个背景,而这个背景是我们自己绘制出来的。Drawable类可以实现该效果:

    1、画笔和view

        /**
         * 画背景的画笔
         */
        private Paint mPaintBg;
    
        mPaintBg = new Paint();
    
        /**
         * textView
         */
        private TextView tv;

    2、初始化画笔:

    //设置画笔的颜色
    mPaintBg.setColor(mContext.getResources().getColor(R.color.theme));
    //类型为填充
    mPaintBg.setStyle(Paint.Style.FILL);
    //抗锯齿
    mPaintBg.setAntiAlias(true);
    mPaintBg.setStrokeWidth(mContext.getResources().getDimension(R.dimen.size));

     2、设置Drawable 

     Drawable drawable = new Drawable() {
                @Override
                public void draw(@NonNull Canvas canvas) {
    //在画布上绘制背景(里面有两个参数,Path,Paint,mPaintBg为我们上面的画笔,
    //至于path,下面会讲)
    canvas.drawPath(path, mPaintBg); } @Override
    public void setAlpha(int i) { } @Override public void setColorFilter(@Nullable ColorFilter colorFilter) { } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } };

    4、在家注意到了,上面的的代码canvas.drawPath(path, mPaintBg);里面参数有一个path,这个path是我们绘制的路径。怎么设置这个path呢?代码如下:

    RectF rectfBg;
    Path path = new Path();
    rectfBg = new RectF(0, 0, leftTv.getWidth(), leftTv.getHeight());
    path.addRoundRect(rectfBg, new float[]{10, 10, 0, 0, 0, 0, 10, 10}, Path.Direction.CW);

    这里用到了Path的一个方法:

    public void addRoundRect (RectF rect, float[] radii, Path.Direction dir)

    增加一个闭合的圆角矩形到path当中

    radii:表示各个角的半径点x,y,依次是左上角,右上角,右下角,左下角,

    rect:矩形位置

    dir:绘制的方向,有两种

    Path.Direction.CW:顺时针

    Path.Direction.CCW:逆时针

    最后把该Drawable设置给textView
    tv.setBackgroundDrawable(drawable)

    就此完成了。

  • 相关阅读:
    uniapp 画圆形或多边形雷达图
    uniApp开发之公用配置文件common.js
    FastAdmin 表格排序
    fastadmin SelectPage field显示多个字段
    PHP装饰器模式
    PHP原型模式,(理解:创建并初始化对象,再复制一个对象避免重复初始化)
    PHP设计模式-观察者模式
    为什么 echo 3 . print(2) . print(4) . 5 . 'c'的结果是45c2131
    PHP数组式访问接口ArrayAccess用法分析
    浏览器兼容性问题总结
  • 原文地址:https://www.cnblogs.com/tangZH/p/8305063.html
Copyright © 2011-2022 走看看