Android群英传笔记系列三 view的自定义:实现一个模拟下载
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的自定义:实现一个模拟下载的更多相关文章
- Android群英传笔记——第三章:Android控件架构与自定义控件讲解
Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...
- Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验
Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...
- Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!
Android群英传笔记--摘要,概述,新的出发点,温故而知新,可以为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席 ...
- Android群英传笔记——第十章:Android性能优化
Android群英传笔记--第十章:Android性能优化 随着Android应用增多,功能越来越复杂,布局也越来越丰富了,而这些也成为了阻碍一个应用流畅运行,因此,对复杂的功能进行性能优化是创造高质 ...
- Android群英传笔记——第九章:Android系统信息和安全机制
Android群英传笔记--第九章:Android系统信息和安全机制 本书也正式的进入尾声了,在android的世界了,不同的软件,硬件信息就像一个国家的经济水平,军事水平,不同的配置参数,代表着一个 ...
- Android群英传笔记——第七章:Android动画机制和使用技巧
Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最 近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中 ...
- Android群英传笔记——第六章:Android绘图机制与处理技巧
Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效 ...
- Android群英传笔记——第四章:ListView使用技巧
Android群英传笔记--第四章:ListView使用技巧 最近也是比较迷茫,但是有一点点还是要坚持的,就是学习了,最近离职了,今天也是继续温习第四章ListView,也拖了其实也挺久的了,list ...
- Android群英传笔记——第八章:Activity与Activity调用栈分析
Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命 ...
随机推荐
- 【翻译】VSM 和触发器
原文:The VisualStateManager and Triggers Author:Carole Snyder Silverlight 推出了可视化状态管理器( Visual State Ma ...
- How can I exclude directories from grep -R?
‘--exclude-dir=dir’ Exclude directories matching the pattern dir from recursive directory searches. ...
- [转载]我们可以用SharePoint做什么
前言 不知不觉作为一个SharePoint的开发人员若干年了,从SharePoint API开始学习,到了解SharePoint的结构,逐渐一点点了解sharepoint的体系:从SharePoint ...
- SQL中的循环
DECLARE @SOInfoList TABLE ( SONumber INT, SODate datetime, Status char(1) ) INSERT INTO @SOInfoList ...
- [JS] JavaScript由浅入深(2) 进阶
本节,将围绕以下几点来讲. 知识点:多线程.作用域.闭包.this 先顶后看 1.多线程 在不支持H5的浏览器中.使用Concurrent.Thread.js. 在支持H5中,使用WebWork. 在 ...
- SpringMVC基础——@ModelAttribute和@SessionAttribute
一.@ModelAttribute 注解 对方法标注 @ModelAttribute 注解,在调用各个目标方法前都会去调用 @ModelAttribute 标记的注解.本质上来说,允许我们在调用目标方 ...
- VC包含目录、附加依赖项、库目录及具体设置
包含目录:#include <headerfile.h>中headerfile.h的搜索目录.如果有XXX.h找不到,设置这个目录可以解决. 附加依赖项:C++的库会把函数.类的声明放在* ...
- Winform开发框架主界面设计展示
做了好多年Winform的程序的开发,主窗口的界面设计一般都要求做的更好一些,可以根据不同的系统功能模块进行归类整合,能使客户迅速寻找到相关功能的同时,也能感觉到整体性的美观大方,因此主窗口的界面设计 ...
- Unity Shader入门基础(一)
渲染流水线 一.渲染流水线 渲染流水线的工作任务在于由一个三维场景出发.生存(或者说渲染)一张二维图像.换句话说,计算机需要从一系列的顶点数据.纹理等信息出发,把这些信息最终转换成一张人眼可以看到 ...
- js获取浏览器当前窗口的高度长度
js获取浏览器可见区域(不包括标题栏.地址栏.收藏夹栏状态栏等额外区域,仅为页面呈现区域)的高度和宽度宽度:document.documentElement.clientWidth高度:documen ...