《Android APP开发从入门到精通》笔记(2)

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。
测量的模式有三种:

  1. EXACTLY:
    精确值模式。当view的layout_width或者layout_height属性设置为具体的数值(如,Android:layout_width=“100dp”)或指定为“match_parent”时(系统会自动分配为父布局大小)。
  2. AT_MOST:
    最大值模式。View的layout_width或layout_height为“wrap_content”
  3. UNSPECIFIED:
    将试图按自己的意愿设置成任意大小。很少用到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值