2016-05-13 37 views
2

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

这是我circle_view绘制:

<?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中正确使用剪辑?

回答

2

你可以实现你自己的Drawable。但是这不能从XML夸大。你需要从代码中设置提拉用

View.setBackgroundDrawable(); 

尝试此示例实现使用绘制画一个半圆。

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

+0

的作品就像一个魅力 –