2015-11-03 35 views
1

要查看以下图像,如何更改android中星形的侧视图的颜色?

Masking star

和代码是,

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.Region; 
import android.view.View; 
import android.graphics.Bitmap; 
import android.graphics.PorterDuff; 
import android.graphics.PorterDuffXfermode; 
import android.graphics.Rect; 
import android.graphics.RectF; 
import android.util.AttributeSet; 

/** 
* Created by chozarajan.pandiyarajan on 11/3/2015. 
*/ 

public class SfRatingItem extends View { 

private int fillColor, minDim, topXPoint, topYPoint; 
private double bigHypot, bigA, bigB, littleHypot, littleA, littleB, value; 
private Paint starPaint; 
private Path path; 
private Bitmap starBitmap; 
private Bitmap backBitmap; 

public SfRatingItem(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    initialize(); 
} 

public SfRatingItem(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    initialize(); 
} 

public SfRatingItem(Context context) { 
    super(context); 
    initialize(); 
    this.setBackgroundColor(Color.GREEN); 

} 

@Override 
protected void onDraw(Canvas canvas) { 
    initialDraw(); 
    Paint q = new Paint(Paint.ANTI_ALIAS_FLAG); 

    //canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),q); // expensive call, instead set a hardware layer 
    setLayerType(LAYER_TYPE_HARDWARE, q); 

    canvas.drawBitmap(backBitmap, 0, 0, q); 
    q.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
    canvas.drawBitmap(starBitmap, 0, 0, q); 
    q.setXfermode(null); 

    Paint p=new Paint(); 
    p.setColor(Color.RED); 
    p.setStyle(Paint.Style.STROKE); 
    p.setAntiAlias(true); 
    canvas.drawPath(path,p); 

} 

private void initialDraw() { 
    starPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
    starPaint.setAntiAlias(true); 

    minDim = Math.min(this.getWidth() - this.getPaddingLeft() - this.getPaddingRight(), this.getHeight() - this.getPaddingTop() - this.getPaddingBottom()); 

    bigHypot = (minDim/Math.cos(Math.toRadians(18))); 
    bigB = minDim; 
    bigA = Math.tan(Math.toRadians(18)) * bigB; 

    littleHypot = bigHypot/(2 + Math.cos(Math.toRadians(72)) + Math.cos(Math.toRadians(72))); 
    littleA = Math.cos(Math.toRadians(72)) * littleHypot; 
    littleB = Math.sin(Math.toRadians(72)) * littleHypot; 

    topXPoint = (this.getWidth() - this.getPaddingLeft() - this.getPaddingRight())/2; 
    topYPoint = this.getPaddingTop(); 

    path.moveTo(topXPoint, topYPoint); 
    path.lineTo((int) (topXPoint + bigA), (int) (topYPoint + bigB)); 
    path.lineTo((int) (topXPoint - littleA - littleB), (int) (topYPoint + littleB)); 
    path.lineTo((int) (topXPoint + littleA + littleB), (int) (topYPoint + littleB)); 
    path.lineTo((int) (topXPoint - bigA), (int) (topYPoint + bigB)); 
    path.lineTo(topXPoint, topYPoint); 
    path.close(); 

    RectF bounds = new RectF(); 
    path.computeBounds(bounds, true); 

    // Draw the background rectangle in a bitmap 
    starPaint.setColor(Color.RED); 
    backBitmap = Bitmap.createBitmap((int) bounds.width(), (int) bounds.height(), Bitmap.Config.ARGB_8888); 
    Canvas backCanvas = new Canvas(backBitmap); 
    final Rect backRect = new Rect(0, 0, 200, backBitmap.getHeight()); 

    // Draw the STAR mask in a bitmap 

    starBitmap = Bitmap.createBitmap((int) bounds.width(), (int) bounds.height(), Bitmap.Config.ARGB_8888); 
    Canvas starCanvas = new Canvas(starBitmap); 
    starPaint.setColor(Color.RED); 
    starCanvas.drawPath(path, starPaint); 
    backCanvas.drawRect(backRect, starPaint); 
} 

private void initialize() { 
    starPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    path = new Path(); 
} 
} 

请看到上述的图像。

在这段代码中,我设置窗口的背景是绿色。

而我的问题是,为什么明星的外面显示黑色?以及如何改变这种颜色?

+0

取消注释'canvas.saveLayer(0,0,帆布.getWidth(),canvas.getHeight(),q)'并注释'setLayerType(LAYER_TYPE_HARDWARE,q);'并尝试。 – Henry

+1

我明白了。谢谢先生。 –

回答

1

这不起作用的原因是因为Hardware acceleration可能被关闭,您需要打开它。请参阅此:http://developer.android.com/guide/topics/graphics/hardware-accel.html

但是,如果你不打算通过Hardware Acceleration要做到这一点,然后用

canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),q); 

,而不是这样的:

setLayerType(LAYER_TYPE_HARDWARE, q); 
相关问题