2015-11-03 29 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); 
相關問題