ShapeDrawable 椭圆形(描边样式)的边缘被剪切(Android Studio)

问题描述 投票:0回答:2

我是 Android Studio 的新手,目前我正在尝试以编程方式创建一个随机颜色、描边宽度和大小的椭圆形(不是实心,只是描边):

        long randomSeedm = System.currentTimeMillis();
        Random random = new Random(randomSeedm);
        int[] color = {R.color.red, R.color.black, .....};

        int ovalWidth = 20 + random.nextInt(100);
        int ovalHeight = 20 + random.nextInt(100);

        ShapeDrawable shape = new ShapeDrawable(new OvalShape());
        shape.setIntrinsicWidth (ovalWidth);
        shape.setIntrinsicHeight (ovalHeight);
        shape.getPaint().setColor(getResources().getColor(color[random.nextInt(6)]));
        shape.getPaint().setStyle(Paint.Style.STROKE);
        shape.getPaint().setStrokeWidth(2+random.nextInt(15));
        shape.getPaint().setAntiAlias(true);

        ImageView oval = new ImageView(this);
        oval.setImageDrawable(shape);

之后我将 ImageView 放入覆盖整个屏幕的 FrameLayout 中:

        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ovalWidth, ovalHeight);
        left = random.nextInt(frameLayoutWidth - ovalWidth);
        top = random.nextInt(frameLayoutHeight - ovalHeight);
        params.leftMargin = left;
        params.topMargin = top;
        params.gravity = Gravity.TOP + Gravity.LEFT;

        frameLayoutWholeScreen.addView(oval, params);

结果非常令人满意(从我初学者的角度来看),唯一的问题是椭圆形的边缘被部分切割。以下是一些示例:

示例1

[1]

示例2

[2]

有什么办法可以避免被割伤吗?

android android-view android-drawable android-paint
2个回答
1
投票

在设置框架布局参数时需要添加描边的值。

    int strokeSize = 2 + random.nextInt(15);
    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ovalWidth + strokeSize, ovalHeight + strokeSize);
    left = random.nextInt(frameLayoutWidth - (ovalWidth + strokeSize));
    top = random.nextInt(frameLayoutHeight - (ovalHeight + strokeSize));
    params.leftMargin = left;
    params.topMargin = top;
    params.gravity = Gravity.TOP + Gravity.LEFT;
    frameLayoutWholeScreen.addView(oval, params);

0
投票

我们的画图仍然存在这个问题。

根据我的分析,绘画似乎试图在视图的边缘(即开始、结束、顶部或底部)绘制笔划,并具有边缘(或相应的开始、结束、顶部或底部点)作为斯托克的中点,这会导致仅显示笔划的一半,而笔划宽度的另一半则绘制在视图之外。这可能是错的,也可能不是。

解决方案:尽量不要在边缘(即开始、结束、顶部或底部)准确地绘制油漆。减小端点的大小。

像下面这样更改端点对我有用:start + (1.dpToPx)、top + (1.dpToPx)、bottom - (1.dpToPx)、end - (1.dpToPx)。

© www.soinside.com 2019 - 2024. All rights reserved.