第十二章—自定义属性
来源:互联网 发布:vb中elseif什么意思 编辑:程序博客网 时间:2024/06/04 17:59
1.在values中新建一个atts.xml的文件
<resources> <declare-styleable name="ArcProgressBar"> <attr name="max" format="integer" /> <attr name="progress" format="integer" /> </declare-styleable></resources>
2.在布局文件中使用自定义属性
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.administrator.lesson12_diyprogressbar.MainActivity"> <com.example.administrator.lesson12_diyprogressbar.ArcProgressBar android:id="@+id/apb" android:layout_width="match_parent" android:layout_height="match_parent" app:max="500" app:progress="23" /></RelativeLayout>
3.在自定义View中实现带AttributeSet属性的构造方法,并且获取自定义值
import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.util.AttributeSet;import android.view.View;public class ArcProgressBar extends View { Paint paint; Paint textPaint; private int max = 100; private int progress = 0; int width; private RectF oval; public ArcProgressBar(Context context) { super(context); init(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //测量布局之后 才能获取宽度 width = getWidth(); oval = new RectF(width / 2 - 100, width / 2 - 100, width / 2 + 100, width / 2 + 100); } public ArcProgressBar(Context context, AttributeSet attrs) { super(context, attrs); //获取自定义属性 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ArcProgressBar); //取出我们的属性 max = a.getInt(R.styleable.ArcProgressBar_max, 100); progress = a.getInt(R.styleable.ArcProgressBar_progress, 0); //一定要释放 a.recycle(); init(); } private void init() { paint = new Paint(); paint.setAntiAlias(true); paint.setDither(true); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(3); textPaint = new Paint(); textPaint.setAntiAlias(true); textPaint.setDither(true); textPaint.setTextAlign(Paint.Align.CENTER); textPaint.setColor(Color.BLUE); textPaint.setTextSize(30); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //灰色圆在背后 paint.setColor(Color.GRAY); canvas.drawCircle(width / 2, width / 2, 100, paint); //绘制一个弧线 进度 paint.setColor(Color.RED); //结束角度 进度/max 50/100; 0.5 *360 canvas.drawArc(oval, -90, (int) (progress * 1f / max * 360), false, paint); //绘制百分比文本 paint.setTextAlign(Paint.Align.CENTER); canvas.drawText((int) (progress * 1f / max * 100f) + "%", width / 2, width / 2, textPaint); } //模拟启动 public void start() { new Thread() { @Override public void run() { while (progress < max) { progress++; try { Thread.sleep(80); postInvalidate(); } catch (InterruptedException e) { e.printStackTrace(); } } if (onProgressCompleteListener != null) { onProgressCompleteListener.onFinish(); } } }.start(); //主线程刷新 // invalidate(); } //1.创建监听 public interface OnProgressCompleteListener { void onFinish(); } //2.创建接口对象 OnProgressCompleteListener onProgressCompleteListener; //3. set方法 public void setOnProgressCompleteListener(OnProgressCompleteListener onProgressCompleteListener) { this.onProgressCompleteListener = onProgressCompleteListener; }}
4.主Activity中启动
import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Toast;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArcProgressBar apb = (ArcProgressBar) findViewById(R.id.apb); apb.setOnProgressCompleteListener(new ArcProgressBar.OnProgressCompleteListener() { @Override public void onFinish(){ runOnUiThread(new Runnable(){ @Override public void run(){ Toast.makeText(getBaseContext(), "执行完毕", Toast.LENGTH_LONG).show(); } }); } }); apb.start(); }}
0 0
- 第十二章—自定义属性
- linux程序设计——线程的属性(第十二章)
- 第十二章—Bitmap
- 第十二章—PopupWindow
- 第十二章—SurfaceView
- 第十二章—动画
- (WPF学习记录)第十二章 自定义面板
- Android自定义控件——自定义属性
- Android 自定义控件——自定义属性
- android 自定义控件 —— 自定义属性
- Android自定义控件——自定义属性
- Android自定义控件——自定义属性
- Android自定义控件——自定义属性
- 自定义初学4——自定义属性
- Android自定义控件——自定义属性
- Android自定义控件——自定义属性
- 自定义控件——自定义属性
- Android自定义控件——自定义属性
- 第十二章—绘制路径Path
- C# Socket简单例子(服务器与客户端通信)
- HDU 5988 Coding Contest(费用流)
- 2015美团点评算法工程师笔试和面试题整理
- Listview的item中有button类导致onitemclick无效
- 第十二章—自定义属性
- Html初步介绍二
- CSS学习笔记:flexbox
- Default arguments VS Overloading
- 关于Visual C++增量链接以及.textbss
- Android 自定义View 之测量过程(onMeasure)
- 几种Dalvik Hook方案研究
- 各大互联网公司如何面试社招程序员
- 10.8交互式绘图