博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
仿iReader切换皮肤进度条
阅读量:6260 次
发布时间:2019-06-22

本文共 5371 字,大约阅读时间需要 17 分钟。

目录

仿iReader切换皮肤进度条

标签(空格分隔): 自定义View


080250538214328.png

本以为使用paint.setXfermode(new PorterDuffXfermode(Mode.XOR));可以轻松搞定,没想到我对PorterDuffXfermode(参考APIDemos代码,路径/APIDemos/Graphics/Xfermodes)的理解有问题,比较悲催了。最后使用了ClipRect的方式实现了这个东西!

定义属性文件:

实现代码:

package com.example.testproject;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import android.view.View;/** *  * @author  * */public class ProgressView extends View {        /** 最大进度 **/    private int maxProgress;        /** 当前进度 **/    private int progress;        /** 当前显示的文字 **/    private String text;        /** 进度和没有交叉的时候的文字的颜色 **/    private int color;        /** 文字和进度交叉的时候的文字的颜色 **/    private int crossColor;        /** 画进度和没有交叉的时候的文字的Paint **/    private Paint paint;        /** 表示进度的Rect **/    private Rect rect;    public ProgressView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init(context, attrs);    }    public ProgressView(Context context, AttributeSet attrs) {        super(context, attrs);        init(context, attrs);    }    public ProgressView(Context context) {        super(context);        init(context, null);    }        private void init(Context context, AttributeSet attrs){        /** 得到XML属性 **/        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ProgressView);                maxProgress = ta.getInt(R.styleable.ProgressView_maxProgress, 100);        progress = ta.getInt(R.styleable.ProgressView_progress, 0);        text = ta.getString(R.styleable.ProgressView_text);        color = ta.getColor(R.styleable.ProgressView_color, Color.GREEN);        crossColor = ta.getColor(R.styleable.ProgressView_crossColor, Color.WHITE);        float textSize = ta.getDimensionPixelOffset(R.styleable.ProgressView_textSize, 20);        ta.recycle();                /** 设置默认的Paint属性 **/        paint = new Paint();        paint.setAntiAlias(true);        paint.setFlags(Paint.ANTI_ALIAS_FLAG);        paint.setStyle(Paint.Style.FILL);        paint.setTextSize(textSize);        paint.setColor(color);            }    @Override    protected void onDraw(Canvas canvas) {        /** 白色背景 **/        canvas.drawColor(Color.WHITE);                /** 恢复颜色 **/        paint.setColor(color);                /** 得到画文字的左上角顶点 **/        int offsetX = (int) ((getWidth() - text.length() * paint.getTextSize()) / 2);        int offsetY = (int) ((getHeight() - paint.getTextSize()) / 2);                /** 画默认文字 **/        canvas.drawText(text, offsetX, offsetY, paint);                /** 画进度 **/        if(rect == null){            rect = new Rect();            rect.left = 0;            rect.top = 0;            rect.bottom = getHeight();        }        rect.right = (int) (getWidth() * progress / (float)maxProgress);        canvas.drawRect(rect, paint);                /** 画交叉的时候的文字 **/        canvas.save();                canvas.clipRect(rect);        paint.setColor(crossColor);        canvas.drawText(text, offsetX, offsetY, paint);                canvas.restore();    }    /**     * 设置最大进度     * @return     */    public int getMaxProgress() {        return maxProgress;    }    /**     * 得到最大进度     * @param maxProgress     */    public void setMaxProgress(int maxProgress) {        this.maxProgress = maxProgress;        invalidate();    }    /**     * 得到当前进度     * @return     */    public int getProgress() {        return progress;    }    /**     * 设置当前进度     * @param progress     */    public void setProgress(int progress) {        this.progress = progress;        invalidate();    }    /**     * 得到显示的文字     * @return     */    public String getText() {        return text;    }    /**     * 设置显示的文字     * @param text     */    public void setText(String text) {        this.text = text;        invalidate();    }    /***     * 设置提示文字的大小     * @param textSize     */    public void setTextSize(int textSize) {        paint.setTextSize(textSize);        invalidate();    }    /***     * 设置进度和没有交叉的时候的文字的颜色     * @param color     */    public void setColor(int color) {        this.color = color;        paint.setColor(color);        invalidate();    }    /**     * 设置进度和文字交叉之后的文字颜色     * @param color     */    public void setCrossColor(int color){        crossColor = color;        invalidate();    }    }

简单测试代码:

package com.example.testproject;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.view.ViewGroup.LayoutParams;public class ProgressTextViewActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);                LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,500);        ProgressView view = new ProgressView(ProgressTextViewActivity.this);        view.setText("正在下载...");        view.setTextSize(40);        view.setMaxProgress(10000);        view.setProgress(5000);        view.setColor(Color.parseColor("#FF336699"));        view.setLayoutParams(params);        view.setCrossColor(Color.WHITE);        setContentView(view);    }}

转载于:https://www.cnblogs.com/xinye/p/4150277.html

你可能感兴趣的文章
一个 Sql语句优化的问题- STATISTICS 统计信息
查看>>
你不知道的KVO的内部实现
查看>>
转】MyEclipse10安装Log4E插件
查看>>
windows server2012r2 安装NET Framework 3.5
查看>>
[osg][osgEarth][原]基于OE自定义自由飞行漫游器(初级版)
查看>>
Java遇见HTML——JSP篇之JSP基础语法
查看>>
导出一个数据库中的表中的某一条数据
查看>>
JQuery初体验
查看>>
全球顶级黑客对决AI GeekPwn2017黑客大赛看点全面曝光
查看>>
浅析前端开发中的 MVC/MVP/MVVM 模式
查看>>
toString、equals和hashCode重写
查看>>
sizeof 和strlen的区别
查看>>
Python与C++引用分析
查看>>
误删一个用户 引起数据不准确问题
查看>>
一场失败的拔河比赛
查看>>
IOS开发工程师欢迎你加入宏略信息
查看>>
java 判断当前时间符合cron时间表达式
查看>>
Telnet协议的实现
查看>>
我的友情链接
查看>>
(一)指南一、初学者指南1、简介2、安装
查看>>