Как нарисовать «теневую» версию изображения? - PullRequest
1 голос
/ 17 декабря 2009

Я застрял на простой проблеме, которая сводит меня с ума. В стандартном Android MapView наложенные изображения автоматически рисуются для них при вызове метода drawAt. Я хочу воссоздать тот же эффект тени, но я не уверен, как правильно выровнять теневую версию изображения (которая рисуется отдельно от основного изображения) в соответствии с основным изображением.

private static class SampleView extends View {
    private Drawable mDrawable;
    private int mMarkerXOffset;
    private int mMarkerYOffset;

    public SampleView(Context context) {
        super(context);

        mDrawable = context.getResources().getDrawable(R.drawable.icon); 
        mDrawable.setBounds(0, 0, mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight()); 

        mMarkerXOffset = (mDrawable.getIntrinsicWidth() / 2);
        mMarkerYOffset = mDrawable.getIntrinsicHeight();
    }

    private void DrawNormalImg(Canvas canvas, int nX, int nY)  {   
        canvas.save(Canvas.MATRIX_SAVE_FLAG);   
        canvas.translate(nX, nY);   
        mDrawable.draw(canvas);   
        canvas.restore();   
    }   

    private void DrawShadowImg(Canvas canvas, int nX, int nY)  { 
        canvas.save(Canvas.MATRIX_SAVE_FLAG);

        mDrawable.setColorFilter(0x7f000000, PorterDuff.Mode.SRC_IN);   

        canvas.translate(nX,nY);   
        canvas.skew(-0.9F, 0.0F);   
        canvas.scale(1.0F, 0.5F);   

        mDrawable.draw(canvas);   
        mDrawable.clearColorFilter();   

        canvas.restore();   
    }  

    @Override protected void onDraw(Canvas canvas) {
        int nX = 100;   
        int nY = 50;   

        canvas.drawColor(Color.WHITE);

        DrawShadowImg(canvas, nX, nY);   
        DrawNormalImg(canvas, nX, nY);
    }

1 Ответ

2 голосов
/ 10 мая 2011

Хороший вопрос! Я думаю, что решение будет искажать изображение в виде параллелограмма. Рассмотрим изображение булавки на карте, которая выглядит примерно так:

..X..
.XXX.
..X..
..|..
..|..
..|..

Где. это прозрачность. Вы хотели бы наклонить изображение таким образом для тени:

     ..X..
    .XXX.
   ..X..
  ..|..
 ..|..
..|..

Обратите внимание, что ширина верхней и нижней частей равна ширине исходного изображения.

...