2011-08-29 11 views
8

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

RotateRectShadow

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.

+0

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

risposta

4

Hai reso la bitmap interna troppo piccola e spazza i bordi della rectange. Prova questo:

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.setColor(Color.BLUE);; 
    shadowPaint.setShadowLayer(12, 12, 12, 0xFF555555); 

    innerCanvas.drawRect(rect, shadowPaint); 

    outerCanvas.drawBitmap(innerBm, 0, 0, null); 
+0

Questo è tutto! Grazie... –

Problemi correlati