自定义View Demo

发布时间:2020-05-05 13:15:24 作者:douruanliang
来源:网络 阅读:328

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);
}

@Override
protected 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);
}

@Override
protected 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();
    }
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int x = getWidth()/2;
    int y = getHeight()/2;
    canvas.drawCircle(x, y, Math.min(x, y), mPaint);
}

}

推荐阅读:
  1. android如何自定义view用path画长方形
  2. Android自定义View实现弹幕效果

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

view %d

上一篇:亚马逊云应用

下一篇:server2012 r2访问共享输入用户及密码

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》