如何在视图底部绘制圆圈段[android]?

时间:2017-03-11 11:38:19

标签: android android-drawable

我的活动应如下所示:

我不确定在顶视图和底视图之间显示圆圈的最佳方式是什么。

我想避免将细分保存为图片。

有没有办法使用drawable xml显示它(我已经尝试使用oval来实现这一点,但我不知道该怎么做才是这样#34 ;平坦&#34)?

也许依赖于canvas

1 个答案:

答案 0 :(得分:21)

我认为选项3是最好的,你可以准确控制你正在绘制的东西,但你没有松散OOP业力点

选项1

您可以为您的热门View创建自定义View,并像这样自己实现绘图,我在这里继承RelativeLayout,但您可以将View任何public class CurveBgRelativeLayout extends RelativeLayout { public CurveBgRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); } private Path path; private Paint paint; @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setStyle(Paint.Style.FILL); paint.setColor(0xffff0000); path = new Path(); float horizontalOffset = w * .8f; float top = -h * .8f; float bottom = h; RectF ovalRect = new RectF(-horizontalOffset, top, w + horizontalOffset, bottom); path.lineTo(ovalRect.left, top); path.arcTo(ovalRect, 0, 180, false); path.setFillType(Path.FillType.INVERSE_EVEN_ODD); } @Override protected void onDraw(Canvas canvas) { if (path != null) canvas.drawPath(path, paint); super.onDraw(canvas); } } 子类化想

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.CurveBgRelativeLayout
        android:layout_width="match_parent"
        android:background="#ffffffff"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#ffff0000"
        />
</LinearLayout>

然后在你的xml布局中

View



选项2

你可以创建一个xml drawable作为顶部View的背景,这里唯一的问题是圆的水平伸展是以dp的大小给出的,所以它不是相对于{{1大小

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:height="40dp"
        android:gravity="bottom">
        <shape android:shape="rectangle">
            <solid android:color="#ffff0000" />
        </shape>
    </item>
    <item
        android:width="500dp"
        android:height="60dp"
        android:gravity="bottom|center_horizontal"
        android:top="-40dp">
        <shape android:shape="oval">
            <solid android:color="#ffffffff" />    
        </shape>
    </item>
    <item
        android:height="30dp"
        android:bottom="30dp"
        android:gravity="bottom">
        <shape android:shape="rectangle">
            <solid android:color="#ffffffff" />
        </shape>
    </item>
</layer-list>


选项3

public class CurveBottomDrawable extends Drawable {

    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Path path = new Path();

    public CurveBottomDrawable(int color) {
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(color);
    }

    @Override
    public void draw(@NonNull Canvas canvas) {

        paint.setStyle(Paint.Style.FILL);
        paint.setColor(0xffff0000);

        path.reset();
        Rect bounds = getBounds();

        float horizontalOffset = bounds.width() * .8f;
        float top = -bounds.height() * .8f;
        float bottom = bounds.height();

        RectF ovalRect = new RectF(-horizontalOffset, top, bounds.width() + horizontalOffset, bottom);
        path.lineTo(ovalRect.left, top);
        path.arcTo(ovalRect, 0, 180, false);
        path.setFillType(Path.FillType.INVERSE_EVEN_ODD);

        canvas.drawPath(path, paint);
    }

    @Override
    public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {
        paint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
        paint.setColorFilter(colorFilter);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSPARENT;
    }

}

然后以编程方式设置

myView.setBackground(new CurveBottomDrawable(0xffff0000));