Popularna gra Words with Friends rysuje płytek z literami na planszy jako jeden podmiot -Jak utworzyć wypukłość wokół mapy bitowej?
Można zobaczyć żółty gradient liniowy stosowane do wszystkich płytek literowych w poniższym zrzucie ekranu, a także wpływ etapie wytłaczania na krawędzi :
W my word game chciałbym mieć podobne efekty:
Więc tworzę planszy o wymiarach mBitmap
, a następnie wyciągnąć wszystkie płytki do niego i wreszcie narysować bitmapę do 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);
Rysunek:
@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
}
The EmbossMaskFilter
efekt działa OK z drawText()
i drawRect()
połączeń, ale to nie działa dla drawBitmap()
:
Moje pytanie: to możliwe, aby korzystać z niektórych kombinacji PorterDuff.Mode narysować (i extractAlpha
?) wygładzić wokół mojej wielkiej bitmapy?
UPDATE:
Patrząc na HolographicOutlineHelper.java I udało się dodać zewnętrzną cień:
z następującego kodu w 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);
}
Rysunek:
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);
}
ale niestety aplikacja działa powoli teraz - a ja nadal nie wiem jak dodać etapie wytłaczania efekt wokół bitmapy.
Dzięki ... Możesz sprawić, aby wygląd wyglądał tak samo poprzez pomnożenie przez 'mScale = getResources(). GetDisplayMetrics(). Density;' –
Tak, chciałbym tylko podkreślić, że może to być problem w kodzie demo, a efekt emboss może być trudny zobaczyć z powodu rozdzielczości ekranu. – varren