热门IT资讯网

自定义View Demo

发表于:2024-11-28 作者:热门IT资讯网编辑
编辑最后更新 2024年11月28日,public class VerticalOffsetLayout extends ViewGroup {private static final int OFFSET = 100;private P

public class VerticalOffsetLayout extends ViewGroup {

private static final int OFFSET = 100;private Paint mPaint;public VerticalOffsetLayout(Context context) {    super(context);    init(context, null, 0);}public VerticalOffsetLayout(Context context, AttributeSet attrs) {    super(context, attrs);    init(context, attrs, 0);}public VerticalOffsetLayout(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    init(context, attrs, defStyleAttr);}private void init(Context context, AttributeSet attrs, int defStyleAttr) {    mPaint = new Paint(Color.BLUE);    mPaint.setAntiAlias(true);    mPaint.setAlpha(125);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    int widthMode = MeasureSpec.getMode(widthMeasureSpec);    int heightMode = MeasureSpec.getMode(heightMeasureSpec);    int widthSize = MeasureSpec.getSize(widthMeasureSpec);    int heightSize = MeasureSpec.getSize(heightMeasureSpec);    int width = 0;    int height = 0;    int childCount = getChildCount();    for (int i = 0; i < childCount; i++) {        View child = getChildAt(i);        ViewGroup.LayoutParams lp = child.getLayoutParams();        int childWidthSpec = getChildMeasureSpec(widthMeasureSpec, 0, lp.width);        int childHeightSpec = getChildMeasureSpec(heightMeasureSpec, 0, lp.height);        child.measure(childWidthSpec, childHeightSpec);    }    switch (widthMode) {        case MeasureSpec.EXACTLY:            width = widthSize;            break;        case MeasureSpec.AT_MOST:        case MeasureSpec.UNSPECIFIED:            for (int i = 0; i < childCount; i++) {                View child = getChildAt(i);                int widthAddOffset = i * OFFSET + child.getMeasuredWidth();                width = Math.max(width, widthAddOffset);            }            break;        default:            break;    }    switch (heightMode) {        case MeasureSpec.EXACTLY:            height = heightSize;            break;        case MeasureSpec.AT_MOST:        case MeasureSpec.UNSPECIFIED:            for (int i = 0; i < childCount; i++) {                View child = getChildAt(i);                height = height + child.getMeasuredHeight();            }            break;        default:            break;    }    setMeasuredDimension(width, height);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {    int left = 0;    int right = 0;    int top = 0;    int bottom = 0;    int childCount = getChildCount();    for (int i = 0; i < childCount; i++) {        View child = getChildAt(i);        left = i * OFFSET;        right = left + child.getMeasuredWidth();        bottom = top + child.getMeasuredHeight();        child.layout(left, top, right, bottom);        top += child.getMeasuredHeight();    }}@Overrideprotected void onDraw(Canvas canvas) {    super.onDraw(canvas);    int x = getWidth()/2;    int y = getHeight()/2;    canvas.drawCircle(x, y, Math.min(x, y), mPaint);}

}

0