Sto provando a creare una bitmap a livello di codice e sto trovando il disegno di un Rect in ombra sta ignorando l'argomento del colore passato. Ho semplificato le cose in questo caso - il codice solo disegna un quadrato blu ruotato, che si suppone di avere un'ombra grigia, ma l'ombra è sempre azzurro:Android Paint setShadowLayer() ignora il colore del suo colore
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#fff"
android:padding="40dp"
>
</LinearLayout>
RotateRectShadowActivity.java:
public class RotateRectShadowActivity extends Activity {
private LinearLayout mMainLayout;
private ImageView mImageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater factory = LayoutInflater.from(this);
mMainLayout = (LinearLayout) factory.inflate(R.layout.main, null);
mImageView = new ImageView(this);
Rect rect = new Rect(0, 0, 300, 300);
Bitmap outerBm = Bitmap.createBitmap(
rect.width(), rect.height(), Bitmap.Config.ARGB_8888);
Bitmap innerBm = Bitmap.createBitmap(
rect.width()-50, rect.height()-50, Bitmap.Config.ARGB_8888);
Canvas outerCanvas = new Canvas(outerBm);
Canvas innerCanvas = new Canvas(innerBm);
outerCanvas.rotate(3);
rect.left += 25;
rect.top += 25;
rect.right += 25;
rect.bottom += 25;
Paint shadowPaint = new Paint();
shadowPaint.setShadowLayer(12, 12, 12, 0xFF555555);
shadowPaint.setColor(0xFF555555);
innerCanvas.drawRect(rect, shadowPaint);
Paint rectPaint = new Paint();
rectPaint.setColor(Color.BLUE);
innerCanvas.drawRect(rect, rectPaint);
outerCanvas.drawBitmap(innerBm, 0, 0, shadowPaint);
mImageView.setImageBitmap(outerBm);
mMainLayout.addView(mImageView);
setContentView(mMainLayout);
}
}
non vedo il motivo per cui la chiamata a outerCanvas.drawBitmap (innerBm, 0, 0, shadowPaint); ha bisogno di un Paint, poiché sto cercando di disegnare l'ombra sul innerBm stesso, tramite innerCanvas, ma quando passo null in non c'è ombra.
Proprio come informazioni aggiuntive: Un secondo Paint è utilizzato per prevenire l'allocazione durante il tempo di pareggio che potrebbe portare a ritardi (UI Thread) ecc – bluewhile