LinearGradient(线性渲染器)介绍(实现歌词效果和进度球效果)

1、LinearGradient(介绍)

查看文档发现它是继承于Shader类的,Shader类专门用来渲染图像以及一些几何图形。

Shader类包括了5个直接子类,分别为:BitmapShader、ComposeShader、LinearGradient、RadialGradient以及SweepGradient。

其中,BitmapShader用于图像渲染;ComposeShader用于混合渲染;LinearGradient用于线性渲染;RadialGradient用于环形渲染;而SweepGradient则用于梯度渲染。



2、使用

LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)

参数一:渐变坐标的起起始x坐标

参数二渐变坐标的起起始y坐标

参数三:渐变坐标的终点x坐标

参数四:渐变坐标的终点Y坐标

参数五:渐变的颜色数组,沿梯度线分布

参数六:参数positions用来指定颜色数组的相对位置(可以为null,如果为null则所述颜色被均匀地分布沿梯度线)

参数七:shader的平铺模式


有以下几种:

      /**
         * replicate the edge color if the shader draws outside of its
         * original bounds
         */
        CLAMP   (0),
        /**
         * repeat the shader's image horizontally and vertically
         */
        REPEAT  (1),
        /**
         * repeat the shader's image horizontally and vertically, alternating
         * mirror images so that adjacent images always seam
         */
        MIRROR  (2);



下面写一个例子:

首先上效果图:

 


代码:

/**
 * @author 雷子
 */
public class MyTextView extends TextView {

    //线性渲染器
    private LinearGradient mLinearGradient;
    //是否停止线程
    private boolean isStop = true;
    //画笔
    private Paint mPaint;

    //相对位置信息
    private float position1;
    private float position2;

    public MyTextView(Context context) {
        this(context, null);
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //开启线程
        new Thread(thread).start();
    }

    //开启一个线程
    private Thread thread = new Thread() {
        @Override
        public void run() {
            super.run();
            while (isStop) {
                position1 += 0.002;
                position2 += 0.002;
                if (position2 >= 1) {
                    position1 = 0f;
                    position2 = 0f;
                }
                try {
                    sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                postInvalidate();
            }
        }
    };

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int length = getText().length();
        float Size = getTextSize();
        float len = length * Size;
        mLinearGradient = new LinearGradient(0, 0, len, 0, new int[]{Color.GREEN, Color.BLUE}, new float[]{position1, position2}, Shader.TileMode.CLAMP);
        getPaint().setShader(mLinearGradient);
    }

    /**
     * 开始
     */
    public void start() {
        isStop = true;
        new Thread(thread).start();
    }

    /**
     * 停止
     */
    public void stop() {
        isStop = false;
    }
}


主要是获取到Paint,然后开一个线程不断改变LinearGradient 相对位置的position值,在调用PostIvalidate(),从而达到渐变的效果,代码量不多,主要是为了加深理解

Activity

public class MyActivity extends BaseActivity {

    @ViewInject(R.id.btn_start)
    private Button btn_start;

    @ViewInject(R.id.tv_text)
    private MyTextView myTextView;

    private boolean isflag = true;


    @Event(value = R.id.btn_start)
    private void onViewClick(View v) {
        if (isflag) {
            btn_start.setText("点击开始");
            myTextView.stop();
            isflag = false;
        } else {
            btn_start.setText("点击停止");
            myTextView.start();
            isflag = true;
        }
    }


XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/whitesmoke"
    android:orientation="vertical">

    <com.lly.miss.view.MyTextView
        android:id="@+id/tv_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="好好学习,天天向上"
        android:textSize="60sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btn_start"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:layout_below="@+id/tv_text"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="82dp"
        android:text="点击停止"
        android:textSize="30sp" />

</RelativeLayout>


 

还可以用在其他方面!

 

还记得360那个圆形清理球吗?下面来试试看!

 

主要代码:(PS:就从之前那个View改了一下)

/**
 * @author 雷子
 */
public class MyButton extends View {

    //线性渲染器
    private LinearGradient mLinearGradient;
    //是否停止线程
    private boolean isStop = true;
    //相对位置信息
    private float position1;
    private float position2;

    //画圆
    private Paint mPaint;
    //画面的边距
    private Paint mPaint1;
    //画文字
    private Paint mPaint2;

    //进度
    int mProgress = 0;
    //进度文字大小
    private float mTextSize = 30f;

    public MyButton(Context context) {
        this(context, null);
    }

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        //开启线程
        new Thread(thread).start();
        mPaint = new Paint();
        mPaint1 = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint1.setColor(Color.LTGRAY);
        mPaint1.setStrokeWidth(2);
        mPaint1.setStyle(Paint.Style.STROKE);

        mPaint2 = new Paint();
        mPaint2.setTextSize(mTextSize);
    }

    //开启一个线程
    private Thread thread = new Thread() {
        @Override
        public void run() {
            super.run();
            while (isStop) {
                position1 += 0.001;
                position2 += 0.001;
                if (position1 >= 1) {
                    position1 = 0f;
                    position2 = 0f;
                }
                try {
                    sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                postInvalidate();
            }
        }
    };

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float len = getWidth();
        mLinearGradient = new LinearGradient(0, getHeight() / 2 + 100, 0, getHeight() / 2 - 100, new int[]{Color.GREEN, Color.WHITE}, new float[]{position1, position2}, Shader.TileMode.CLAMP);
        mPaint.setShader(mLinearGradient);
        //画圆
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, 100, mPaint);
        //画圆边框
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, 102, mPaint1);
        //画进度比
        mProgress = (int) ((position1 / 1) * 100);
        float textWidth = mPaint2.measureText(mProgress + "%");
        canvas.drawText(mProgress + "%", getWidth() / 2 - textWidth / 2, getWidth() / 2 + mTextSize / 2, mPaint2);
    }

    /**
     * 开始
     */
    public void start() {
        isStop = true;
        new Thread(thread).start();
    }

    /**
     * 停止
     */
    public void stop() {
        isStop = false;
    }
}


效果图:

 

 

 

是不是有点像!很多东西都是靠自己想象的!要试着自己去尝试~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在echarts折线图中实现渐变效果,可以使用areaStyle和lineStyle属性来设置。在series中,通过设置areaStyle的color属性为一个线性渐变对象,可以实现区域面积的渐变效果。同时,通过设置lineStyle的color属性为一个线性渐变对象,可以实现折线的渐变颜色效果。 以下是一个示例代码,展示了如何在echarts折线图中实现渐变效果: ```javascript const option = { xAxis: { type: 'category', data: \['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'\] }, yAxis: { type: 'value' }, series: \[ { type: 'line', smooth: true, showSymbol: false, lineStyle: { normal: { width: 4, color: new echarts.graphic.LinearGradient(0, 0, 1, 0, \[ { offset: 0, color: 'rgb(0, 255, 255, 0)' }, { offset: 0.2, color: 'rgb(0, 255, 255, 0)' }, { offset: 0.4, color: 'rgb(0, 200, 200, 80)' }, { offset: 0.6, color: 'rgb(0, 200, 200, 80)' }, { offset: 0.8, color: 'rgb(0, 255, 255, 0)' }, { offset: 1, color: 'rgb(0, 255, 255, 0)' } \]) } }, areaStyle: { color: { type: 'linear', x: 0, y: 0, x2: 0, y2: 1, colorStops: \[ { offset: 0, color: 'rgb(0, 50, 100)' }, { offset: 0.5, color: 'rgb(0, 50, 100, 50)' }, { offset: 1, color: 'rgb(0, 50, 100, 0)' } \] } }, data: \[150, 230, 224, 218, 135, 147, 260\] } \] }; // 使用以上option配置绘制折线图 ``` 在上述代码中,通过设置lineStyle的color属性为一个线性渐变对象,实现了折线的渐变颜色效果。同时,通过设置areaStyle的color属性为一个线性渐变对象,实现了区域面积的渐变效果。 希望这个示例能够帮助到你实现echarts折线图的渐变效果。 #### 引用[.reference_title] - *1* [Echarts折线图折线呈现为渐变线条](https://blog.csdn.net/u010234868/article/details/131475802)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Echarts-折线图-设置线条颜色以及线条以下区域显示渐变颜色](https://blog.csdn.net/WQearl/article/details/120216290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值