Come indicato nel video, per questo si utilizza Canvas#saveLayerAlpha(....)
. Puoi anche ottenere un effetto simile senza usarlo. Ne parlerò più avanti.
Creiamo una vista di esempio:
public class SampleView extends View {
// Declare Paint objects
Paint paintColor, paintBorder;
public SampleView(Context context) {
super(context);
// Initialize and set up Paint objects
paintColor = new Paint();
paintBorder = new Paint();
paintColor.setAntiAlias(true);
paintBorder.setAntiAlias(true);
paintBorder.setColor(Color.BLACK);
paintBorder.setStyle(Style.STROKE);
paintBorder.setStrokeWidth(10);
// Just a random image to 'see' the difference
setBackground(getResources().getDrawable(R.drawable.hor_lines));
}
@Override
protected void onDraw(Canvas canvas) {
// Save layer alpha for Rect that covers the view : alpha is 90/255
canvas.saveLayerAlpha(0, 0, getWidth(), getHeight(), 90,
Canvas.HAS_ALPHA_LAYER_SAVE_FLAG);
// Draw first circle, and then the border
paintColor.setColor(Color.RED);
canvas.drawCircle(getWidth()/3, getHeight()/2,
getWidth()/4 - 20, paintColor);
canvas.drawCircle(getWidth()/3, getHeight()/2,
getWidth()/4 - 15, paintBorder);
// Draw second circle, and then the border
paintColor.setColor(Color.BLUE);
canvas.drawCircle(2 * getWidth()/3, getHeight()/2,
getWidth()/4 - 20, paintColor);
canvas.drawCircle(2 * getWidth()/3, getHeight()/2,
getWidth()/4 - 15, paintBorder);
// Finally, restore the canvas
canvas.restore();
}
}
Cosa accade:
una bitmap fuori schermo viene allocata quando saveLayerAlpha(....)
è chiamato.
Tutte le operazioni di disegno si verificano su questa bitmap.
Quando viene chiamato canvas.restore()
, questo bitmap viene trasferito nell'area di disegno sullo schermo e il valore alfa che viene fornito in saveLayerAlpha(....)
viene applicato alla bitmap fuori dallo schermo.
(credo) che segue è un modo equivalente di creazione di questo effetto senza usare saveLayerAlpha(....)
:
public class SView extends View {
Paint paintColor, paintBorder, paintAlpha;
Bitmap toDrawOn;
public SView(Context context) {
super(context);
paintAlpha = new Paint();
paintAlpha.setColor(Color.parseColor("#90FFFFFF"));
paintAlpha.setAntiAlias(true);
....
....
}
@Override
protected void onDraw(Canvas canvas) {
if (toDrawOn == null) {
// Create a new Bitmap
toDrawOn = Bitmap.createBitmap(getWidth(), getHeight(),
Config.ARGB_8888);
// Create a new Canvas; drawing operations
// will happen on 'toDrawOn'
Canvas offScreen = new Canvas(toDrawOn);
// First circle
paintColor.setColor(Color.RED);
offScreenCanvas.drawCircle(getWidth()/3, getHeight()/2,
getWidth()/4 - 20, paintColor);
offScreenCanvas.drawCircle(getWidth()/3, getHeight()/2,
getWidth()/4 - 15, paintBorder);
// Second circle
paintColor.setColor(Color.BLUE);
offScreenCanvas.drawCircle(2 * getWidth()/3, getHeight()/2,
getWidth()/4 - 20, paintColor);
offScreenCanvas.drawCircle(2 * getWidth()/3, getHeight()/2,
getWidth()/4 - 15, paintBorder);
// Draw bitmap 'toDrawOn' to canvas using 'paintAlpha'
canvas.drawBitmap(toDrawOn, 0, 0, paintAlpha);
} else {
// 'toDrawOn' is not null; draw it
canvas.drawBitmap(toDrawOn, 0, 0, paintAlpha);
}
}
}
uscita:
Solo per riferimento, la contenitore di base nell'immagine sopra è un LinearLayout
con sfondo impostato su questo jpeg: Link.
E, drawable utilizzato come sfondo della SampleView:
// Just a random image to 'see' the difference
setBackground(getResources().getDrawable(R.drawable.hor_lines));
è tratto da: here.
sei sicuro che sia l'alpha che vuoi cambiare? sembra che il tuo effetto desiderato abbia ancora zero trasparenza, è solo alleggerito. – Scott
Sì, ho bisogno di trasparenza perché sto usando uno sfondo con texture che deve essere visto. – EGHDK
Il mio pensiero migliore è quindi vedere se c'è un modo per disegnare le forme sovrapposte come una forma (o combinarle come una dopo che sono state disegnate). Aggiungere alfa alla forma composta dovrebbe risultare nel modo desiderato. – Scott