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);
    }
}

时间: 2024-08-26 19:44:04

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

Android群英传笔记系列一view的介绍

学习完第一行代码后,继续学习Android群英传,希望能坚持下去,好好学习完这本书,并及时做好相关笔记,巩固相关知识: 一. View的介绍: 1`.我们先来看下view树结构: 2.树结构内容: a.viewparent是整棵树的核心,它统一调度和分配所有的交互管理事件. b.控件分为viewgroup和view两种控件,viewgroup作为父控件可以包含多个vie       w控件. c.我们知道在使用控件前都要通过findViewById的方法来实例化控件,那么在树结构中,实际上表现为

Android群英传笔记系列二view的绘制(一)

三 .view的绘制 1.  使用方法:通过继承view并重写它的onDraw()方法来完成绘图. 2.  具体实现: a.先定义一个Canvas对象,这个对象类似于一个花板,定义方法如下:Canvas canvas=new Canvas(bitmap); b.我们可以看到在定义Canvas对象时,我们传入了一个bitmap对象,那么这个bitmap的作用是什么呢?其实bitmap的作用是存储所有绘制在Canvas上的像素信息.比如: canvas.drawBitmap(bitmap1,0,0,

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

Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 这一章很多,但是很有趣,也是这书的最后一章知识点了,我现在还在考虑要不要写这个拼图和2048的案例,在此之前,我们先来玩玩Android5.X的新特性吧!

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

Android群英传笔记--摘要.概述,新的出发点,温故而知新.能够为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席的<Android开发艺术探索>.主要是再全面点的把自己所学的知识消化,这样也就不枉自己天天熬夜学习了,如今群英传快看完了.准备又一次再看一遍,同一时候把笔记以博客的形式记录下来,这样或许更加的深刻,然后再消磨一下主席的那本书,这本书有视频解说,更加好,所以估计以后应该非常少再写其它的博客,只是工

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

Android群英传笔记--第四章:ListView使用技巧 近期也是比較迷茫.可是有一点点还是要坚持的,就是学习了.近期离职了,今天也是继续温习第四章ListView,也拖了事实上也挺久的了,listview可谓是老牌大将了,非常多的应用场景都要使用它,他也是我们用得最多的控件之中的一个了,尽管如今出来了一个RecyclerView,可是ListView的地位一时半会儿还是撼动不了的.这就促使我们更加应该去把他掌握了 一.Listview经常使用优化技巧 我们一步步来把ListView学习好

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

Android群英传笔记--第九章:Android系统信息和安全机制 本书也正式的进入尾声了,在android的世界了,不同的软件,硬件信息就像一个国家的经济水平,军事水平,不同的配置参数,代表着一个android帝国的强弱,所以厂商喜欢打配置战,本节就要是讲 Android系统信息的获取 PackageManager的使用 ActivityManager的使用 Android安全机制 一. Android系统信息的获取 由于android手机的开源性,手机的配置各种各样,那些优化大师之类的东西

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

Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中十分重要的一部分,从早期的Android版本中,由于动画机制和绘图机制的不健全,Android的人机交互备受诟病,Android从4.X开始,特别是5.X,动画越来越完善了,Google也开始重视这一方面了,我们本章学习的主要内容有 Android视图动画' Android属性动画 Android动画

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

Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命周期和管理方式,是了解Android的基础,本节主讲 Activity的生命周期与工作模式 Activity调用栈管理 一.Activity Activity作为四大组建出现平率最高的组件,我们在哪里都能看到他,就让我们一起先来了解一下他的生命周期 1.起源 Activity是用户交互的第一接口,他

Android群英传笔记——第五章:Android Scroll分析

一.滑动效果是如何产生的 滑动一个View的本质其实就是移动一个View,改变其当钱所在的位置,他的原理和动画效果十分的相似,就是通过不断的改变View的坐标来实现这一效果,动态且不断的改变View的坐标,从而实现View跟随用户触摸滑动而滑动 但是在讲解滑动效果之前,需要先了解一下Android中窗口坐标体系和屏幕的触控事件--MotionEvent 1.Android坐标系 在物理学上,要描述一个物体的运动,就必须选定一个参考系,所谓滑动,正是相对于参考系的运动,在Android,系统将屏幕