Android--view自定义--圆环等待
2016-04-15 22:12
344 查看
一:自定义属性
二:与生命周期进行绑定时,不能强制退出线程,故提供一个一个状态,改变状态值或者更新状态值,让线程停止
三:线程与VIEW生命周期进行绑定
onAttachedToWindow运行在onResume之后<可以理解为进入到view时执行>
在执行过程中:会执行两次,第一次状态为INVISABLE,第二次状态更新为VISABLE int visibility>–4–>0
退出时执行
<resources> <attr name="firstColor" format="color" /> <attr name="secondColor" format="color" /> <attr name="circleWidth" format="dimension" /> <attr name="speed" format="integer" /> <declare-styleable name="CustomProgressBar"> <attr name="firstColor" /> <attr name="secondColor" /> <attr name="circleWidth" /> <attr name="speed" /> </declare-styleable> </resources>
二:与生命周期进行绑定时,不能强制退出线程,故提供一个一个状态,改变状态值或者更新状态值,让线程停止
public abstract class FrameThread extends Thread { protected boolean running = false; public FrameThread() { } public void run() { this.onPreExecute(); while (this.running) { this.doWork(); } this.onPostExecute(); } public void onPostExecute() { } public void onPreExecute() { } protected abstract void doWork(); public synchronized void start() { this.running = true; super.start(); } public void shutDown() { this.running = false; } public boolean isRunning() { return this.running; } }
public class CircleView extends View { private int mFirstColor; private int mSecondColor; private int mCircleWidth; private Paint mPaint; private int mProgress; private int mSpeed; FrameThread myThred; private boolean isNext = false; public CircleView(Context context) { this(context, null); } public CircleView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CircleView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //属性获取有两种方式 TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomProgressBar, defStyleAttr, 0); int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { case R.styleable.CustomProgressBar_firstColor: mFirstColor = a.getColor(attr, Color.GREEN); break; case R.styleable.CustomProgressBar_secondColor: mSecondColor = a.getColor(attr, Color.RED); break; case R.styleable.CustomProgressBar_circleWidth: mCircleWidth = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_PX, 20, getResources().getDisplayMetrics())); break; case R.styleable.CustomProgressBar_speed: mSpeed = a.getInt(attr, 20); break; } } a.recycle(); mPaint = new Paint(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int centre = getWidth() / 2; int radius = centre - mCircleWidth / 2; mPaint.setStrokeWidth(mCircleWidth); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); RectF oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius); if (!isNext) { mPaint.setColor(mFirstColor); canvas.drawCircle(centre, centre, radius, mPaint); mPaint.setColor(mSecondColor); canvas.drawArc(oval, -90, mProgress, false, mPaint); } else { mPaint.setColor(mSecondColor); canvas.drawCircle(centre, centre, radius, mPaint); mPaint.setColor(mFirstColor); canvas.drawArc(oval, -90, mProgress, false, mPaint); } } @Override protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if (View.VISIBLE== visibility) { if (myThred == null) { myThred = new CircleThred(); myThred.start(); } } } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); } @Override protected void onDetachedFromWindow() { if (myThred.isAlive()) { myThred.shutDown(); } super.onDetachedFromWindow(); } class CircleThred extends FrameThread { @Override protected void doWork() { while (true) { mProgress++; if (mProgress == 360) { mProgress = 0; if (!isNext) isNext = true; else isNext = false; } postInvalidate(); try { Thread.sleep(mSpeed); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
三:线程与VIEW生命周期进行绑定
@Override protected void onAttachedToWindow() { super.onAttachedToWindow(); }
onAttachedToWindow运行在onResume之后<可以理解为进入到view时执行>
@Override protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); }
在执行过程中:会执行两次,第一次状态为INVISABLE,第二次状态更新为VISABLE int visibility>–4–>0
@Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); }
退出时执行
相关文章推荐
- 五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程
- Android-五子连珠
- 一个基于场景感应的android智能手机防丢失系
- Android Activity彻底运行起来之后的回调onPostCreate( )
- Android之Surfaceview和SurfaceHolder用法
- 【Android 应用开发】GitHub 优秀的 Android 开源项目
- Android--Camera.addCallbackBuffer/setPreviewCallbackWithBuffer模式使用总结
- Android:布局实例之模仿京东登录界面
- 学习Android第8天,Asynctask的使用(异步操作)
- Android:PopupWindow简单弹窗改进版
- android应用程序Manifest文件简介
- Android:PopupWindow简单弹窗
- [android]ShareSDK——内容分享和短信验证
- Android:密码显示隐藏
- Android(三)----数据存储和界面展现02
- Android:利用SharedPreferences实现自动登录
- Android:控件AutoCompleteTextView 客户端保存搜索历史自动提示
- Android学习笔记---(自己实现SimpleAdapter)BaseAdapter
- Android:控件AutoCompleteTextView 自动提示
- 怎样让你的APK跑在 com.android.phone 进程