【问题标题】:How to change the color of the side view of the star in android?如何在android中更改星星侧视图的颜色?
【发布时间】:2016-02-03 05:38:48
【问题描述】:

要查看下图,

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();
 }
}

请看上面提到的图片。

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

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

【问题讨论】:

  • 在代码中取消注释 canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),q) 并注释 setLayerType(LAYER_TYPE_HARDWARE, q); 并尝试。

标签: android drawing


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2020-05-20
    • 2018-01-02
    • 2019-07-23
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多