android 自定义图片圆形进度条
感觉话一个圆形进度条挺简单的 ,但是却偏偏给了几张图片让你话,说实话我没接触过,感觉好难,还好百度有大把的资源,一番努力下终于画出来了。 代码如下。
package com.etong.cpms.widget;
import java.net.Proxy.Type;
import com.etong.cpms.activity.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Paint.FontMetricsInt;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
*
*/
public class MyView extends View {
private Bitmap bmpBg;
private Bitmap bmpForbg;
private Bitmap bmpDb;
private Bitmap bmpNq;
private PorterDuffXfermode mMode;
private Paint mXferPaint;
private RectF mOval;
private int mPercent;
private Paint paint;
private Rect targetRect;
private FontMetricsInt fontMetrics;
/**
*
*
* @param context
*/
public MyView(Context context) {
super(context);
}
int widthPixels;
int heightPixels;
int centerX;
int centerY;
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
widthPixels = w;
heightPixels = h;
centerX = widthPixels / 2;
centerY = heightPixels / 2;
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
setFocusable(true);
// setFocusableInTouchMode(true);
bmpBg = (Bitmap) BitmapFactory.decodeResource(getResources(),
R.drawable.wq);
bmpForbg = (Bitmap) BitmapFactory.decodeResource(getResources(),
R.drawable.mdwq);
bmpDb = (Bitmap) BitmapFactory.decodeResource(getResources(),
R.drawable.db);
bmpNq = (Bitmap) BitmapFactory.decodeResource(getResources(), R.drawable.nq);
mMode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);//锟斤拷锟斤拷
mXferPaint = new Paint();
mXferPaint.setXfermode(mMode);//锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷图片锟洁交时模式
mOval = new RectF();
mOval.left = 0;
mOval.top = 0;
mPercent = 0;
paint = new Paint();
paint.setColor(Color.GREEN);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setTextSize(60);
targetRect = new Rect(centerX - bmpBg.getWidth() / 2, centerY - bmpBg.getHeight() / 2, centerX + bmpBg.getWidth() / 2,
centerY + bmpBg.getWidth() / 2);
fontMetrics = paint.getFontMetricsInt();
}
/**
*
*/
@Override
protected void onDraw(Canvas canvas) {
mXferPaint.setXfermode(null);
canvas.drawBitmap(bmpBg, centerX - bmpBg.getWidth() / 2, centerY - bmpBg.getHeight() / 2, mXferPaint);
int saveCount = canvas.saveLayer(centerX - bmpBg.getWidth() / 2, centerY - bmpBg.getHeight() / 2,centerX + bmpBg.getWidth() / 2,
centerY + bmpBg.getWidth() / 2, null, Canvas.MATRIX_SAVE_FLAG
| Canvas.CLIP_SAVE_FLAG
| Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
| Canvas.FULL_COLOR_LAYER_SAVE_FLAG
| Canvas.CLIP_TO_LAYER_SAVE_FLAG);
// mOval.left = 100;
// mOval.top = 100;
// mOval.right = 100 + bmpBg.getWidth();
// mOval.bottom = 100 + bmpBg.getHeight();
mOval.left = centerX - bmpBg.getWidth() / 2;
mOval.top = centerY - bmpBg.getHeight() / 2;
mOval.right = centerX + bmpBg.getWidth() / 2;
mOval.bottom = centerY + bmpBg.getWidth() / 2;
mXferPaint.setXfermode(null);
canvas.drawArc(mOval, -90, 360 * mPercent / 100, true, mXferPaint);
mXferPaint.setXfermode(mMode);
// canvas.drawBitmap(bmpForbg, 100, 100, mXferPaint);
canvas.drawBitmap(bmpForbg, centerX - bmpForbg.getWidth() / 2, centerY - bmpForbg.getHeight() / 2, mXferPaint);
canvas.restoreToCount(saveCount);
int baseline = targetRect.top
+ (targetRect.bottom - targetRect.top - fontMetrics.bottom + fontMetrics.top)
/ 2 - fontMetrics.top;
//
paint.setTextAlign(Align.CENTER);
paint.setTextAlign(Align.CENTER);
canvas.drawBitmap(bmpNq, centerX - bmpNq.getWidth() / 2, centerY - bmpNq.getHeight() / 2, paint);
canvas.drawText(mPercent + "%", centerX, centerY+80, paint);
canvas.drawBitmap(bmpDb, centerX - bmpDb.getWidth() / 2, centerY - bmpDb.getHeight() / 2-50, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mPercent++;
mPercent %= 100;
//
invalidate();
// postInvalidate();
return true;
}
}
android 自定义图片圆形进度条的更多相关文章
- Android 自定义 View 圆形进度条总结
Android 自定义圆形进度条总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 微信公众号:牙锅子 源码:CircleProgress 文中如有纰漏,欢迎大家留言指出. 最近 ...
- Android自定义圆角矩形进度条2
效果图: 或 方法讲解: (1)invalidate()方法 invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时, 调用invalidate()才 ...
- Android自定义控件之圆形进度条ImageView
From:http://blog.csdn.net/xiadik/article/details/41648181package com.wangran.beautiful_girl_show.vie ...
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
Android 高手进阶(21) 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明地址:http://blog.csdn.net/xiaanming/article/detail ...
- 【Android 应用开发】 自定义 圆形进度条 组件
转载著名出处 : http://blog.csdn.net/shulianghan/article/details/40351487 代码下载 : -- CSDN 下载地址 : http://down ...
- Android 自定义view --圆形百分比(进度条)
转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50334595 注:本文由于是在学习过程中写的,存在大量问题(overdraw onDr ...
- Android 带进度的圆形进度条
最近项目有个需求,做带进度从下到上的圆形进度条. 网上查了一下资料,发现这篇博客写得不错http://blog.csdn.net/xiaanming/article/details/10298163 ...
- 自定义VIew——漂亮的圆形进度条
package com.example.firstapp; import java.text.DecimalFormat; import android.annotation.SuppressLint ...
- Android 高手进阶,自己定义圆形进度条
背景介绍 在Android 开发中,我们常常遇到各种各样绚丽的控件,所以,依靠我们Android本身所带的控件是远远不够的,许多时候须要我们自定义控件,在开发的过程中.我们公司遇到了一种须要自己写的一 ...
随机推荐
- Android ViewPager+TabHost实现首页导航
今天发的是TabHost结合ViewPager实现首页底部导航的效果,虽然说网上有很多这样的Demo,不过呢,我还是要把自己练习写的发出来,没错!就是这么任性: 先上效果图,如下: 代码里面有注释,就 ...
- 【Linux】Vmware&Linux 网络配置
Vmware 网络设置 Linux 网络设置 注:本实验使用Linux 版本为 RedHat 6.3 Vmware 网络设置 1.Vmware 网络工作模式 bridged(桥接模式) -- 网络能提 ...
- Ubuntu 安装第一步,打开ssh
http://blog.csdn.net/u010447234/article/details/53557795 1.检查是否有ssh在运行 ps -e | grep ssh* 2.安装openssh ...
- Android DiskLruCache完全解析,硬盘缓存的最佳方案 --转载
概述 记得在很早之前,我有写过一篇文章 Android高效加载大图.多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache ...
- 狂欢圣诞节,Azure云邀你一起云端跑酷!
想要速度更快? 希望绕过障碍? 还想安全抵达目的地? …… 平安夜夜游时的各种畅想,不也正是 IT 同事所追求的,更是业务发展的终极目标呀. 好啦,小编说的太多了,这样不好不好.过节休息不谈工作,那就 ...
- Flask入门模板Jinja2语法与函数(四)
1 模板的创建 模板文件结构: project/ templates/ 模板文件 跳转模板一般使用: from flask import render_template,render_template ...
- tdf sample
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...
- SpringMvc-helloword
说明:在此只说明helloword的简单实现,通过helloword例子先了解springMvc是这样工作的,然后在一步步的研究原理 配置web.xml 1.配置servlet servlet-cla ...
- ZT在谷歌上班感受如何?
在谷歌上班感受如何? 2013-11-05 作者:腾讯科技 出处: 互联网 责编:zlu 在谷歌这家全球最大最有抱负的技术公司工作将是怎样的情景呢?是天堂般的享受,还是地狱般的折磨呢?下面看一 ...
- 设计模式——建造者模式(BuilderPattern)
建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. UML图: Builder: package com.cnblog.clarck; /** * ...