如何在xml中剪辑圆圈

时间:2016-05-13 07:58:48

标签: android xml

我需要在xml中创建半圆。我遇到了剪辑,但我不确定如何使用它。

这是我的circle_view drawable:

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">

<solid
    android:color="#666666"/>

<size
    android:width="120dp"
    android:height="120dp"/>
</shape>

这就是我用剪辑试过的:

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
  android:clipOrientation="vertical"
  android:drawable="@drawable/circle_view"
  android:gravity="top"/>

但结果却一无所获。如何在纯xml中正确使用剪辑?

1 个答案:

答案 0 :(得分:2)

您可以实现自己的Drawable。但这不能从XML中膨胀。您需要使用

从代码中设置drawable
 View.setBackgroundDrawable();

尝试使用此示例实现以使用drawable绘制半圆。

public class SemiCircleDrawable extends Drawable {

private Paint paint;
private RectF rectF;
private int color;
private Direction angle;

public enum Direction
{
    LEFT,
    RIGHT,
    TOP,
    BOTTOM
}

public SemiCircleDrawable() {
    this(Color.BLUE, Direction.LEFT);
}

public SemiCircleDrawable(int color, Direction angle) {
    this.color = color;
    this.angle = angle;
    paint = new Paint();
    paint.setColor(color);
    paint.setStyle(Style.FILL);
    rectF = new RectF();
}

public int getColor() {
    return color;
}

/**
 * A 32bit color not a color resources.
 * @param color
 */
public void setColor(int color) {
    this.color = color;
    paint.setColor(color);
}

@Override
public void draw(Canvas canvas) {
    canvas.save();

    Rect bounds = getBounds();

    if(angle == Direction.LEFT || angle == Direction.RIGHT)
    {
        canvas.scale(2, 1);
        if(angle == Direction.RIGHT)
        {
            canvas.translate(-(bounds.right / 2), 0);
        }
    }
    else
    {
        canvas.scale(1, 2);
        if(angle == Direction.BOTTOM)
        {
            canvas.translate(0, -(bounds.bottom / 2));
        }
    }


    rectF.set(bounds);

    if(angle == Direction.LEFT)
        canvas.drawArc(rectF, 90, 180, true, paint);
    else if(angle == Direction.TOP)
        canvas.drawArc(rectF, -180, 180, true, paint);
    else if(angle == Direction.RIGHT)
        canvas.drawArc(rectF, 270, 180, true, paint);
    else if(angle == Direction.BOTTOM)
        canvas.drawArc(rectF, 0, 180, true, paint);
}

@Override
public void setAlpha(int alpha) {
    // Has no effect
}

@Override
public void setColorFilter(ColorFilter cf) {
    // Has no effect
}

@Override
public int getOpacity() {
    // Not Implemented
    return 0;
}

}

致谢:#Vivek Khandelwal