仿iReader切换皮肤进度条

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


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

定义属性文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ProgressView">
<attr name="text" format="string"/>
<attr name="textSize" format="dimension"/>
<attr name="color" format="color"/>
<attr name="progress" format="integer"/>
<attr name="maxProgress" format="integer"/>
<attr name="crossColor" format="color"/>
</declare-styleable>
</resources>

实现代码:

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);
}
}

仿iReader切换皮肤进度条的更多相关文章

  1. 自定义仿 QQ 健康计步器进度条

    自定义仿 QQ 健康计步器进度条 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:CircleProgress 文中如有纰漏,欢迎大家留言指出. 闲着没事,趁上班时间偷偷撸了 ...

  2. 仿IOS圆形下载进度条

    /** * Created by C058 on 2016/5/25. */ public class MyHoriztalProgressBar extends ProgressBar { priv ...

  3. Android开发-各种各样好看漂亮的进度条,指示器,加载提示汇总

    导读:之前项目中用到一些进度条,找了不少,打算写个demo自己总结一下,留着以后用, 有些是自己写的,有些是github上找的别人的库,如果大家觉得好看可以用,直接下载复制代码到项目里就可以用,ok ...

  4. Qt编写自定义控件17-按钮进度条

    前言 按钮进度条,顾名思义,表面上长得像一个按钮,单击以后切换成进度条指示按钮单击动作执行的进度,主要用在一些需要直接在按钮执行动作显示对应进度的场景,在很多网页中经常看到这种效果,这个效果有个优点就 ...

  5. Android -- 真正的 高仿微信 打开网页的进度条效果

    (本博客为原创,http://www.cnblogs.com/linguanh/) 目录: 一,为什么说是真正的高仿? 二,为什么要搞缓慢效果? 三,我的实现思路 四,代码,内含注释 五,使用方法与截 ...

  6. Core Animation一些Demo总结 (动态切换图片、大转盘、图片折叠、进度条等动画效果)

    前一篇总结了Core Animation的一些基础知识,这一篇主要是Core Animation 的一些应用,涉及到CAShapeLayer.CAReplicatorLayer等图层的知识. 先看效果 ...

  7. Android特效专辑(十一)——仿水波纹流量球进度条控制器,实现高端大气的主流特效

    Android特效专辑(十一)--仿水波纹流球进度条控制器,实现高端大气的主流特效 今天看到一个效果挺不错的,就模仿了下来,加上了一些自己想要的效果,感觉还不错的样子,所以就分享出来了,话不多说,上图 ...

  8. Unity3D 场景切换加载进度条实现

    需要三个场景,场景A,场景B,场景C: 场景A:一个按钮,点击加载场景B: 场景B:从A切换到C过度场景,加载进度条: 场景C:目标场景: 创建OnProgress.cs脚本: using Syste ...

  9. iOS8 无缝切换WKWebView,借鉴IMYWebview,解决进度条,cookie,本地页面等问题

    webkit使用WKWebView来代替IOS的UIWebView和OSX的WebView,并且使用Nitro JavaScript引擎,这意味着所有第三方浏览器运行JavaScript将会跟safa ...

随机推荐

  1. 命令行查看linux发行版版本信息

    有时候安装完自己的linux发行版系统(如ubuntu.centos.redhat.opensuse.--)时,把版本信息忽略了,又不想重启电脑,此时我们可以通过命令行方式来查看: 1.cat /et ...

  2. Centos6.7下安装配置VPN

    在Vultr上买了台VPS准备做VPN,不贵5刀,位置是日本东京的.ping值在100-200之间,还好算说的过去. Vultr地址 系统选择的Centos6 的版本是6.7 在网上查了查linux下 ...

  3. 基于OWIN ASP.NET WebAPI 使用OAUTH2授权服务的几点优化

    前面在ASP.NET WEBAPI中集成了Client Credentials Grant与Resource Owner Password Credentials Grant两种OAUTH2模式,今天 ...

  4. SRS用列建模

    基本规则: 五子棋是两个人之间进行的竞技活动,由于对黑方白方 规则不同,黑棋必须先行.五子棋专用盘为 15×15 , 五连子的方向为横.竖.斜. 禁手是对局中被判为负的行棋手段.白棋无禁手. 在棋盘上 ...

  5. windowsXP用户被禁用导致不能网站登录

    1.查看系统事件,发现弹出如下的错误 2.根据上面的错误,我们很容易就可以判断是禁用了账户引起的 2.1后面进入计算机管理,再进入用户管理 2.2双击点开Internet来宾用于,发现此用户已经停用了 ...

  6. Arduino I2C + 三轴加速度计LIS3DH

    LIS3DH是ST公司生产的MEMS三轴加速度计芯片,实现运动传感的功能.主要特性有: 宽工作电压范围:1.71 ~ 3.6V 功耗:低功耗模式2μA:正常工作模式.ODR = 50Hz时功耗11μA ...

  7. 使用Gradle运行集成测试

    如果Gradle构建的项目是一个web项目的话,里面可能包含一些集成测试和功能性测试.这些测试和单元测试不同之处是在运行之前要先在本地将web服务启动起来,并且跑完测试后能够自动的关闭web服务. 在 ...

  8. TaskCompletionSource的使用场景

    TaskCompletionSource生成Task的另一种方法.使用TaskCompletionSource很简单,只需要实例化它即可.TaskCompletionSource有一个Task属性,你 ...

  9. Django站点管理--ModelAdmin

    class AuthorAdmin(admin.ModelAdmin): list_display=('name', 'age', 'sex') #指定要显示的字段 search_fields=('n ...

  10. Vue.js双向绑定的实现原理和模板引擎实现原理(##########################################)

    Vue.js双向绑定的实现原理 解析 神奇的 Object.defineProperty 这个方法了不起啊..vue.js和avalon.js 都是通过它实现双向绑定的..而且Object.obser ...