J'essaie de créer une ombre de réflexion et j'ai trouvé un problème.Android: Shader se comporte différemment dans 'onDraw (canvas)' et 'new Canvas (bitmap)'
S'il vous plaît trouver le code ci-dessous à mon avis personnalisé:
@Override
protected void onDraw(Canvas canvas) {
//prepare
canvas.drawColor(Color.GRAY);
Bitmap source = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
//First Column
canvas.drawBitmap(source, 0, 0, new Paint());
//2nd Column
canvas.drawBitmap(source, source.getWidth(), 0, new Paint());
//Reflection
Matrix matrix = new Matrix();
matrix.preScale(1.0f, -1.0f);
matrix.postTranslate(source.getWidth(), source.getHeight()*2);
canvas.drawBitmap(source, matrix, new Paint());
Paint paint2 = new Paint();
LinearGradient shader = new LinearGradient(
source.getWidth()*3/2,
source.getHeight(),
source.getWidth()*3/2,
source.getHeight()*2,
0x7FFFFFFF, 0x00FFFFFF, TileMode.CLAMP);
paint2.setShader(shader);
paint2.setXfermode(new PorterDuffXfermode(
android.graphics.PorterDuff.Mode.DST_IN));
canvas.drawRect(
source.getWidth(),
source.getHeight(),
source.getWidth()*2,
source.getHeight()*2,
paint2);
//3rd Column
Bitmap bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight()*2, Config.ARGB_8888);
Canvas canvas2 = new Canvas(bitmap);
canvas2.drawBitmap(source, 0, 0, new Paint());
matrix = new Matrix();
matrix.preScale(1.0f, -1.0f);
matrix.postTranslate(0, source.getHeight()*2);
canvas2.drawBitmap(source, matrix, new Paint());
paint2 = new Paint();
shader = new LinearGradient(
source.getWidth()*1/2,
source.getHeight(),
source.getWidth()*1/2,
source.getHeight()*2,
0x7FFFFFFF, 0x00FFFFFF, TileMode.CLAMP);
paint2.setShader(shader);
paint2.setXfermode(new PorterDuffXfermode(
android.graphics.PorterDuff.Mode.DST_IN));
canvas2.drawRect(
0,
source.getHeight(),
source.getWidth(),
source.getHeight()*2,
paint2);
canvas.drawBitmap(bitmap, source.getWidth()*2,0, new Paint());
}
Je fais même en toile (que je suis arrivé de onDraw(canvas)
) et Canvas2 (qui a créé à l'aide new Canvas(bitmap)
)
Mais, à la fois dessin effet de shader différent comme suit:
Pourquoi les effets de shader sont-ils différents?
Merci pour votre explication. –
Merci pour votre explication. Mais encore je ne suis pas clair sur la source et la destination, La destination n'est pas l'état de la toile avant l'appel drawRect() (je veux dire, une toile avec l'image dessinée au-dessus de cela). Plutôt l'état quand il a été créé. J'ai changé le code source de la 3ème colonne en tant que \t \t // 3ème colonne \t \t Bitmap bitmap = Bitmap.createBitmap (source.getWidth(), source.getHeight() * 2, Config.RGB_565); \t \t bitmap.eraseColor (Color.GRAY); alors obtenu la même que la 2ème colonne. Il semble que nous ne pouvions pas changer le canevas d'onDraw (canevas) pour qu'il se comporte comme un canevas bitmap hors écran? –
Si vous utilisez Config.RGB_565, vous supprimez le canal alpha du bitmap hors écran. Il ne peut donc pas être fusionné lorsqu'il est dessiné sur le canevas de la fenêtre. Il va simplement remplacer les pixels de destination. –