自定义控件 和 自定义控件的 子控件 位置

来源:互联网 发布:姚明生涯数据 编辑:程序博客网 时间:2024/06/16 04:43

正方形的位置 是以 左上角 与右下角 确定位置

扇形 的开始点是 三点钟方向 顺时开始的

自定义控件的 子控件 位置----------------------------


 /**

     * 当前控件的宽高
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);


        if (getChildCount()>0){
            View childAt = getChildAt(0);
            //测量子控件
            measureChild(childAt,widthMeasureSpec,heightMeasureSpec);


        }


    }


    //这里是父控件定位子控件在父控件中的位置...布局(补得是子控件)
    @Override
    protected void onLayout(boolean b, int i, int i1, int i2, int i3) {


        int childCount = getChildCount();//拿到容器里面子控件的数量
        if (childCount>0){
            View childAt = getChildAt(0);//根据角标取出里面的子控件


            childAt.layout(10,10,childAt.getMeasuredWidth()+10,childAt.getMeasuredHeight()+10);
        }


    }

}


自定义控件的 子控件 位置----------------------------

/**
 * Created by Dash on 2017/11/29.
 */
public class MeasureView extends View {
    //在代码中new对象的时候使用
    public MeasureView(Context context) {
        super(context);
    }


    //在xml布局的时候调用这个构造方法
    public MeasureView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }


    //也是在xml布局的时候使用,需要制定一个主题样式...一般来讲我们用的是默认的主题
    public MeasureView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    /*public MeasureView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }*/


    /**
     * 测量控件的大小....如果是一个容器可以测量自己也可测量他身上的子控件
     *
     *
     * @param widthMeasureSpec 包含了大小和模式的数值,,,,当前控件的宽度/高度....32位
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);


        int mode = MeasureSpec.getMode(widthMeasureSpec);
        int size = MeasureSpec.getSize(widthMeasureSpec);


        if (mode == MeasureSpec.EXACTLY){
            //300dp......900px
            //xxhdpi 1dp = 3px xhdpi 1dp = 2px hdpi 1dp = 1.5px
            Toast.makeText(getContext(),"size:"+size,Toast.LENGTH_SHORT).show();
        }


        //在onMeasure方法中直接设置大小.....在代码里面宽度和高度都是使用像素值
        //只是初步指定一个大小,最终是由这个方法确定的,如果不去设置就用最开始指定的大小
        setMeasuredDimension(100,100);


    }

}


原创粉丝点击