onDraw介绍和总结前面两节说的onLayout和onMeasure

来源:互联网 发布:木门 erp 源码 编辑:程序博客网 时间:2024/04/30 03:06

onDraw用来来描绘控件是什么样子的

onLayOut、onMeasure、onDraw我觉得调用时机应该是这样子的;

我是一个view,外部的父容器调用我layout,measure,draw方法,

触发我的onLayOut、onMeasure、onDraw方法


我可以再layOut中放置我的子控件的位置,可以再onMeasure中觉得我自身的大小,可以再onDraw中决定我自身的长相


package com.ymtj.test.myapplication;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.view.ViewGroup;/** * Created by fei on 2015/10/22. */public class MyViewGroup extends ViewGroup {    // 子View的水平间隔    private final static int padding = 20;    public MyViewGroup(Context context, AttributeSet attrs) {        super(context, attrs);        // TODO Auto-generated constructor stub    }    /**     * 是ViewGroup的方法,用于定义这个子控件如何摆放     * @param changed     * @param l     * @param t     * @param r     * @param b     */    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {        // TODO Auto-generated method stub        // 动态获取子View实例        for (int i = 0, size = getChildCount(); i < size; i++) {            View view = getChildAt(i);            // 放置子View,宽高都是100            view.layout(l, t, l + 100, t + 100);            l += 100 + padding;        }    }    /**     * 当前这个容器测量的方法,接收这个容器的父亲传过来的可用空间,然后决定当前这个view的大小     * @param widthMeasureSpec     * @param heightMeasureSpec     */    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int wMode = MeasureSpec.getMode(widthMeasureSpec);        int hMode = MeasureSpec.getMode(heightMeasureSpec);        if(MeasureSpec.AT_MOST == hMode){            Log.i("main","出现1");        }        if(MeasureSpec.EXACTLY == hMode){            Log.i("main","出现2");        }        int widthMeasure = MeasureSpec.getSize(widthMeasureSpec);        int heightMeasure = MeasureSpec.getSize(heightMeasureSpec);        setMeasuredDimension(widthMeasure*4, heightMeasure*4);    }    /**     * 描绘当前view的外观     * @param canvas     */    @Override    protected void onDraw(Canvas canvas) {        // 首先定义一个paint        Paint paint = new Paint();        // 绘制矩形区域-实心矩形        // 设置颜色        paint.setColor(Color.WHITE);        // 设置样式-填充         paint.setStyle(Paint.Style.FILL);        // 绘制一个矩形         canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);        // 绘空心矩形        // 设置颜色                paint.setColor(Color.RED);        // 设置样式-空心矩形                paint.setStyle(Paint.Style.STROKE);        // 绘制一个矩形                canvas.drawRect(new Rect(10, 10, 50, 20), paint);        // 绘文字        // 设置颜色                paint.setColor(Color.GREEN);        // 绘文字                canvas.drawText("hello", 30, 30, paint);        // 绘图        // 从资源文件中生成位图         //       Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.aa);        // 绘图           //     canvas.drawBitmap(bitmap, 10, 10, paint);        super.onDraw(canvas);    }}

<RelativeLayout  android:padding="10dp" android:layout_height="100dp" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">    <com.ymtj.test.myapplication.MyViewGroup android:layout_height="50dp" android:layout_width="match_parent" android:background="#0000ff">      <!--  <View android:layout_height="match_parent" android:layout_width="match_parent" android:background="#ff0000" />        <View android:layout_height="match_parent" android:layout_width="match_parent" android:background="#00ff00" />-->       </com.ymtj.test.myapplication.MyViewGroup></RelativeLayout>


0 0
原创粉丝点击