感觉话一个圆形进度条挺简单的 ,但是却偏偏给了几张图片让你话,说实话我没接触过,感觉好难,还好百度有大把的资源,一番努力下终于画出来了。 代码如下。

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 自定义图片圆形进度条的更多相关文章

  1. Android 自定义 View 圆形进度条总结

    Android 自定义圆形进度条总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 微信公众号:牙锅子 源码:CircleProgress 文中如有纰漏,欢迎大家留言指出. 最近 ...

  2. Android自定义圆角矩形进度条2

    效果图: 或 方法讲解: (1)invalidate()方法 invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时, 调用invalidate()才 ...

  3. Android自定义控件之圆形进度条ImageView

    From:http://blog.csdn.net/xiadik/article/details/41648181package com.wangran.beautiful_girl_show.vie ...

  4. Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)

      Android 高手进阶(21)  版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明地址:http://blog.csdn.net/xiaanming/article/detail ...

  5. 【Android 应用开发】 自定义 圆形进度条 组件

    转载著名出处 : http://blog.csdn.net/shulianghan/article/details/40351487 代码下载 : -- CSDN 下载地址 : http://down ...

  6. Android 自定义view --圆形百分比(进度条)

    转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50334595 注:本文由于是在学习过程中写的,存在大量问题(overdraw onDr ...

  7. Android 带进度的圆形进度条

    最近项目有个需求,做带进度从下到上的圆形进度条. 网上查了一下资料,发现这篇博客写得不错http://blog.csdn.net/xiaanming/article/details/10298163 ...

  8. 自定义VIew——漂亮的圆形进度条

    package com.example.firstapp; import java.text.DecimalFormat; import android.annotation.SuppressLint ...

  9. Android 高手进阶,自己定义圆形进度条

    背景介绍 在Android 开发中,我们常常遇到各种各样绚丽的控件,所以,依靠我们Android本身所带的控件是远远不够的,许多时候须要我们自定义控件,在开发的过程中.我们公司遇到了一种须要自己写的一 ...

随机推荐

  1. angular2-响应式表单

    响应式表单是同步的.模板驱动表单是异步的.这个不同点很重要 使用响应式表单,我们会在代码中创建整个表单控件树. 我们可以立即更新一个值或者深入到表单中的任意节点,因为所有的控件都始终是可用的. 模板驱 ...

  2. node的版本控制之nvm的安装与使用

    NVM的安装 windows下的安装: windows下的离线安装: nvm 的windows下载地址:https://github.com/coreybutler/nvm-windows/relea ...

  3. Angular js 双向绑定时字符串的转换成 数字类型的问题

    问题: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <scrip ...

  4. 使用 richtextbox 输出程序运行信息

    private delegate void Refresh_CallBack(Color color,string text); private void ControlsRefresh(Color ...

  5. MyISAM引擎表出现“Error 'Incorrect key file for table”

    mysql主从复制中的从库突然出现了警报,sql_thread停止了,show slave status\G;查看 mysql> show slave status\G ; . row **** ...

  6. 学习笔记-java 多线程

    背景说明: 多线程并发与管理,是java基础知识里的重点,本文根据<java核心技术第八版>中的多线程技术的学习,对知识点进行整理:这里只对基础知识点进行简单罗列,以达到对知识点有网状关联 ...

  7. Android SDK Manager 如何下载?

    修改 "C:\Windows\System32\driver\etc\hosts" 文件,添加以下两行 203.208.40.111 dl-ssl.google.com 203.2 ...

  8. OpenGL总结

    最近2D转向3D,也从固定管线转到了可编程管线,有些细节的东西记录一下. Geometry Shader Geometry Shader从Vertex Shader中获取数据,向Fragment Sh ...

  9. 漫谈C++:良好的编程习惯与编程要点(转载)

    这个博主写的文章真是细腻,全面,严谨,应当多读几回 原文http://www.cnblogs.com/QG-whz/p/5517643.html 阅读目录 以良好的方式编写C++ class Clas ...

  10. EXCRT

    是个好东西,可以处理在模数不互质的同余方程组 核心就是用扩欧来合并方程 如果我们有两个形如\(x\equiv b_1(mod\ a_1)\) \(x\equiv b_2(mod\ a_2)\)的方程我 ...