Android控件
View
1.Android的UI界面都是由View及其派生类组合而成。View类是所有UI组件的基类。开发Android应用程序的UI界面一般不会直接使用View,而是使用View的派生类。
2. 每一个View都有一个用于绘图的画布,只要重写onDraw方法,就能绘制界面显示。
3. 有时可以根据需求定制View,如画饼状图等。
自定义View
package com.example.firstapp;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import java.util.Random;
public class MyView extends View {
MyThread mythread;
private Paint paint;//画笔
private RectF rectF=new RectF(150,150,380,380);
private int sweepAngle=0;//弧的当前度数
private int sweepAngleAdd=20;//每次弧增加的度数
private Random random=new Random();
private boolean running=true;//控制循环
public MyView(Context context, AttributeSet attrs){
super(context,attrs);
init(context,attrs);
}
public MyView(Context context){
this(context,null);
}
private void init(Context context,AttributeSet attrs){
paint=new Paint();
paint.setTextSize(60);
}
protected void logic(){
sweepAngle+=sweepAngleAdd;
//随机设置画笔颜色
int r=random.nextInt(255);
int g=random.nextInt(255);
int b=random.nextInt(255);
paint.setARGB(255,r,g,b);
if(sweepAngle>=360){
sweepAngle=0;
}
}
private class MyThread extends Thread{
@Override
public void run(){
while(running){
logic();
postInvalidate();//重新绘制会调用ondraw()
try {
Thread.sleep(200);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
@Override
protected void onDraw(Canvas canvas){
Log.i("MyView","onDraw");
if(mythread==null){
mythread=new MyThread();
mythread.start();
}else{
/*
* 第一个参数:rectF 左上的坐标x,y,右下的坐标x,y
* 第二个参数:弧形开始的角度
* 第三个参数:弧形结束的角度
* 第四个参数:true:画扇形,false:画弧线
* 第五个参数:画笔
* */
canvas.drawArc(rectF,0,sweepAngle,true,paint);
}
}
@Override
protected void onDetachedFromWindow(){
running=false;
super.onDetachedFromWindow();
}
}
在模拟器上发现只有Hello World,只写了MyView,不知是代码有错还是少写了什么。看到后来发现原来还要在activity_main.xml里配。然而配了以后还是不行。求大神。这本书不适合初学者。亲测。
View测量(重写OnMeasure方法)
MeasureSpec是一个静态内部类,它封装了父View传给子View的layout。measure方法中有两个参数widthMeasureSpec和heightMeasureSpec。
测量的模式有三种:
- EXACTLY:
精确值模式。当view的layout_width或者layout_height属性设置为具体的数值(如,Android:layout_width=“100dp”)或指定为“match_parent”时(系统会自动分配为父布局大小)。 - AT_MOST:
最大值模式。View的layout_width或layout_height为“wrap_content” - UNSPECIFIED:
将试图按自己的意愿设置成任意大小。很少用到。