Il popolare gioco Words with Friends disegna tessere al tabellone di gioco come una singola entità -Come creare rilievo su una bitmap?
Potete vedere una linea gialla gradiente applicato a tutte le tessere nel seguente screenshot e anche un effetto rilievo sul bordo :
In my word game Vorrei avere effetti simili:
Così ho creare un gioco da tavolo di dimensioni mBitmap
, quindi disegnare tutte le tessere in esso e infine disegnare la bitmap in my custom view -
Setup:
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
// create yellow linear gradient
mGradStart = new Point(3 * mWidth/4, mHeight/3);
mGradEnd = new Point(mWidth/4, 2 * mHeight/3);
LinearGradient gradient = new LinearGradient(
mGradStart.x,
mGradStart.y,
mGradEnd.x,
mGradEnd.y,
new int[]{ 0xCCFFCC00, 0xCCFFCC99, 0xCCFFCC00 },
null,
TileMode.CLAMP);
// create the big bitmap holding all tiles
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
mPaintGrad = new Paint();
mPaintGrad.setShader(gradient);
mPaintEmboss = new Paint();
mPaintEmboss.setShader(gradient);
EmbossMaskFilter filter = new EmbossMaskFilter(
new float[] { 0f, 1f, 0.5f }, 0.8f, 3f, 3f);
mPaintEmboss.setMaskFilter(filter);
Disegno:
@Override
protected void onDraw(Canvas canvas) {
mGameBoard.draw(canvas);
// draw all tiles as rectangles into big bitmap
// (this code will move to onTouchEvent later)
mBitmap.eraseColor(Color.TRANSPARENT);
for (SmallTile tile: mTiles) {
mCanvas.drawRect(
tile.left,
tile.top,
tile.left + tile.width,
tile.top + tile.height,
mPaintGrad);
tile.draw(mCanvas);
}
canvas.drawBitmap(mBitmap, 0, 0, mPaintEmboss); // emboss NOT displayed
canvas.drawText("TEXT WORKS OK", 400, 400, mPaintEmboss); // ebmoss OK
canvas.drawRect(300, 600, 800, 1200, mPaintEmboss); // emboss OK
}
EmbossMaskFilter
effetto funziona bene con drawText()
e drawRect()
chiamate, ma non funziona per il drawBitmap()
:
La mia domanda: è possibile utilizzare alcune combinazioni di PorterDuff.Mode per disegnare un (e extractAlpha
?) rilievo attorno alla mia grande bitmap?
UPDATE:
Osservando HolographicOutlineHelper.java sono stato in grado di aggiungere un'ombra esterna:
con il seguente codice nel MyView.java -
Setup:
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
mScale = getResources().getDisplayMetrics().density;
mGradStart = new Point(3 * mWidth/4, mHeight/3);
mGradEnd = new Point(mWidth/4, 2 * mHeight/3);
LinearGradient gradient = new LinearGradient(
mGradStart.x,
mGradStart.y,
mGradEnd.x,
mGradEnd.y,
new int[]{ 0xCCFFCC00, 0xCCFFCC99, 0xCCFFCC00 },
null,
TileMode.CLAMP);
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
mPaintGrad = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
mPaintGrad.setShader(gradient);
mPaintBlur = new Paint();
mPaintBlur.setColor(Color.BLACK);
BlurMaskFilter blurFilter = new BlurMaskFilter(mScale * 1, Blur.OUTER);
mPaintBlur.setMaskFilter(blurFilter);
}
Disegno:
private void prepareBitmaps() {
mBitmap.eraseColor(Color.TRANSPARENT);
for (SmallTile tile: mTiles) {
mCanvas.drawRect(
tile.left,
tile.top,
tile.left + tile.width,
tile.top + tile.height,
mPaintGrad);
tile.draw(mCanvas);
}
mAlphaBitmap = mBitmap.extractAlpha(mPaintBlur, mOffset);
}
@Override
protected void onDraw(Canvas canvas) {
mGameBoard.draw(canvas);
canvas.drawBitmap(mAlphaBitmap, mOffset[0], mOffset[1], mPaintBlur);
canvas.drawBitmap(mBitmap, 0, 0, mPaintGrad);
}
ma purtroppo l'applicazione agisce lento ora - e io ancora non so come aggiungere un effetto rilievo in tutto il bitmap.
Grazie ... Puoi rendere il rilievo in rilievo stesso moltiplicando con 'mScale = getResources(). GetDisplayMetrics(). Density;' –
Sì, volevo solo sottolineare che potrebbe essere un problema nel codice dimostrativo e l'effetto rilievo potrebbe essere difficile vedere a causa della risoluzione dello schermo. – varren