1.实现效果:动态显示进度(分别显示了整个的动态改变的过程,然后完成后,弹出一个对话框)

     

2.实现过程:可以分为绘制一个圆,圆弧和文本三部分,然后在MainAcitivity中通过线程模拟下载进度。

a.定义一个类继承至view,然后添加其构造函数,记得一定要添加含有Attributset参数的构造函数;

b.定义和初始化一些数据:

private int mCircleXY;
private int mWidth;
private float mRadius;
private Paint mCirclePaint,mArcPaint,mTextPaint;
private String mShowText="Android";
private int mTextSize=15;
private int mSweepAngle=0;

c.在构造函数中获取到当前屏幕的宽度,并调用自定义的initView函数

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
//获取屏幕高度
WindowManager manager= (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
mWidth=manager.getDefaultDisplay().getWidth();
initView();
}

d.自定义的函数,主要是完成圆,圆弧和文字的画笔的定义

public void initView(){
//设置圆心位置和圆的半径]
mCircleXY=mWidth/2;
mRadius=(float)(mWidth*0.5)/2;
//设置圆的画笔
mCirclePaint=new Paint();
mCirclePaint.setColor(Color.BLUE);
//设置弧的画笔
mArcPaint=new Paint();
//设置线宽
mArcPaint.setStrokeWidth(60);
//设置风格
mArcPaint.setStyle(Paint.Style.STROKE);
//设置颜色
mArcPaint.setColor(Color.BLUE);
//设置文字画笔
mTextPaint=new Paint();
mTextPaint.setColor(Color.WHITE);
mTextPaint.setTextSize(mTextSize);
mTextPaint.setTextAlign(Paint.Align.CENTER);
}

e.在onDraw函数中绘制圆,圆弧和文字:

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制矩阵
//这里分别设置了矩阵的左,上,右,下的位置
RectF mArcRectF=new RectF((float)(mWidth*0.1),(float)(mWidth*0.1),(float)(mWidth*0.9),(float)(mWidth*0.9));
//绘制圆
canvas.drawCircle(mCircleXY,mCircleXY,mRadius,mCirclePaint);
//绘制弧线
/*
* 第一个参数为上面构建的矩阵,实际上可以理解为在规定的矩阵内画弧线
* 第二参数为开始画的角度,这里设置为270
* 第三个参数为结束的角度
*这里一般设置为false,如果为true的话,它会显示出圆弧的半径,直到绘制完成后,才会消失
* 最后一个参数为我们设置的画笔
* */
canvas.drawArc(mArcRectF,270,mSweepAngle,false,mArcPaint);
//绘制文本
/*
* 第一个参数为我们显示内容
* 第二参数为开始显示的位置
* 第三个参数为结束显示的位置
* 第四个参数为文本显示的x轴位置,后者为y轴的位置
* 最后一个参数为我们定义的画笔
* */
canvas.drawText(mShowText,0,mShowText.length(),mCircleXY,mCircleXY+(mTextSize/4),mTextPaint);
}

f.自定义两个函数,用来在其他地方动态改变角度和文字:

public void setSweepAngle(int sweepValue){
if (sweepValue!=0){
mSweepAngle=sweepValue;
}else{
mSweepAngle=0;
}
//注意这里要添加,刷新
invalidate();
}
public void setShowText(String text){
if (!text.equals("")){
mShowText=text;
}else{
mShowText="Android";
}
invalidate();
}

g.在布局文件中引用:

<main.view.com.myview.MyView
android:id="@+id/myView"
android:layout_width="match_parent"
android:layout_height="match_parent" />

h.在MainActivity中的实现:

package main.view.com.myview;

import android.content.DialogInterface;
import android.os.Handler;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class MainActivity extends AppCompatActivity {
private MyView myView;
private int mAngle=0;
private float current=0;
Handler handler=new Handler();
Runnable runnable=new Runnable() {
@Override
public void run() {
//转换为百分制
current=(float)mAngle/360*100;
//分别设置角度和文字
myView.setShowText("当前所在比例为:"+(int)current);
myView.setSweepAngle(mAngle);
mAngle=mAngle+20;
if (mAngle<=360){
//当没有完成的话,3秒后再次运行该线程
handler.postDelayed(runnable,3000);
}else{
//完成后,弹出对话框
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
builder.setMessage("下载完成!").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { }
}).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myView= (MyView) findViewById(R.id.myView);
handler.post(runnable);
}
}

Android群英传笔记系列三 view的自定义:实现一个模拟下载的更多相关文章

  1. Android群英传笔记——第三章:Android控件架构与自定义控件讲解

    Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...

  2. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  3. Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!

    Android群英传笔记--摘要,概述,新的出发点,温故而知新,可以为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席 ...

  4. Android群英传笔记——第十章:Android性能优化

    Android群英传笔记--第十章:Android性能优化 随着Android应用增多,功能越来越复杂,布局也越来越丰富了,而这些也成为了阻碍一个应用流畅运行,因此,对复杂的功能进行性能优化是创造高质 ...

  5. Android群英传笔记——第九章:Android系统信息和安全机制

    Android群英传笔记--第九章:Android系统信息和安全机制 本书也正式的进入尾声了,在android的世界了,不同的软件,硬件信息就像一个国家的经济水平,军事水平,不同的配置参数,代表着一个 ...

  6. Android群英传笔记——第七章:Android动画机制和使用技巧

    Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最 近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中 ...

  7. Android群英传笔记——第六章:Android绘图机制与处理技巧

    Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效 ...

  8. Android群英传笔记——第四章:ListView使用技巧

    Android群英传笔记--第四章:ListView使用技巧 最近也是比较迷茫,但是有一点点还是要坚持的,就是学习了,最近离职了,今天也是继续温习第四章ListView,也拖了其实也挺久的了,list ...

  9. Android群英传笔记——第八章:Activity与Activity调用栈分析

    Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命 ...

随机推荐

  1. 高手详解SQL性能优化十条建议

    1.查询的模糊匹配  尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 解决办法: 其实只需要对该脚本略做改进,查询速度便 ...

  2. ES6入门系列一(基础)

    1.let命令 Tips: 块级作用域(只在当前块中有效) 不会变量提升(必须先申明在使用) 让变量独占该块,不再受外部影响 不允许重复声明 总之:let更像我们熟知的静态语言的的变量声明指令 ES6 ...

  3. 使用aspose.cell动态导出多表头 EXCEL

    效果图: 前台调用: using System; using System.Collections.Generic; using System.Linq; using System.Web; usin ...

  4. css中zoom和transform:scale的区别

    css中zoom和transform:scale的区别 关于zoom: 以前只是看到别人的代码中用过zoom,自己从未使用过,今天在探究ie7兼容inline-block时,发现里面提到了zoom.下 ...

  5. EF封装类,供参考!

    以下是我对EF DB FIRST 生成的ObjectContext类进行封装,代码如下,供参考学习: using System; using System.Collections.Generic; u ...

  6. 6/13 sprint2 看板和燃尽图的更新

  7. <!DOCTYPE> 的理解

    [[ from <!DOCTYPE> 标签的深入理解 ]] 前言: 今天被问道“有没有仔细了解过<!DOCTYPE>标签?”,愣了一下,因为一开始在W3cschool上看到过建 ...

  8. Ext.NET 4.1 最新版本破解

    Ext.NET 4.1 最新版本破解 今天在将Ext.NET 4.1版本的程序发布到公网时居然要license(localhost和127.0.0.1不收费),而且一年$4999,突然间觉得这是什么鬼 ...

  9. 微软modern.IE网站,多版本IE免费测试工具集

    微软今天发布了modern.IE,这是一系列免费的.针对Web 开发者的测试工具和资源集合网站,微软希望以此来帮助开发者更轻松地实现跨 IE 和其他现代浏览器.跨设备的兼容性,其他还有代码检测工具.标 ...

  10. 【C#进阶系列】08 方法

    实例构造与引用类型 之前的章节其实已经写过了引用类型的构造过程: 首先当然是,在堆中,为引用类型的实例对象分配内存,然后初始化对象的附加字段(即类型对象指针和同步块索引). 这个时候为对象分配的内存都 ...