2016-05-13 17 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から膨らませることはできません。

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魔法のように

+0

作品 –

関連する問題