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. 页面头部title、description、keywords标签的优化

    页面头部优化<Head></Head>中间的区域中间的区域,我们称为网页的头部.在网页的头部中,通常存放一些介绍页面内容的信息,例如页面标题.描述及关键字等等.在头部优化中,除 ...

  2. java中子类与父类中隐含的this引用的分析

    /* 看一下下面的程序,看是否你的答案和运行的答案是否一致! */ class Parent{ public int x; public Parent p; public Parent(){} pub ...

  3. HTML5探索一(那些新增的标签和属性)

    tml5相比html4,添加了部分语义化的标签和属性,现在我们就从这些标签和属性开始,学习html5吧. 首先,认识下HTML5新的文档类型: <!DOCTYPE html> 那些新标签 ...

  4. Java hashCode() 和 equals()的若干问题解答

    本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 == 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equa ...

  5. [ML] Naive Bayes for email classification

    20 Newsgroups (Original) Author: Jeffrey H 1. Introduction This is only a test report for naive baye ...

  6. 论python中的作用域

    编程语言从早至今,可以分为面向过程编程.面向函数编程和面向对象编程.BASIC语言是典型的面向过程编程的语言,C语言支持面向函数编程,但不支持面向对象,JAVA只支持面向对象编程,python同时支持 ...

  7. Google FlatBuffers——开源、跨平台的新一代序列化工具

    前段时间刚试用了一个序列化工具cereal,请看cereal:C++实现的开源序列化库,打算再总结下我对google proto buf序列化库的使用呢, 结果还没动手,大Google又出了一个新的. ...

  8. Week1项目报告

    1. 预测时间 Personal Software Process Stages Time(h) 计划 · 估计这个任务需要多少时间 16.5 开发 · 需求分析 (包括学习新技术) 4 · 生成设计 ...

  9. [ASP.NET] 结合Web API在OWIN下实现OAuth

    OAuth(Open Authorization) 为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码), ...

  10. 后缀数组 --- WOj 1564 Problem 1564 - A - Circle

    Problem 1564 - A - Circle Problem's Link:   http://acm.whu.edu.cn/land/problem/detail?problem_id=156 ...