2015-11-03 3 views
1

Чтобы увидеть ниже изображение,Как изменить цвет вид сбоку звезды в андроиде?

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); 
Смежные вопросы