Я застрял в простой проблеме, которая сводит меня с ума. В стандартном наложении наложения MapView 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);
}
Хороший вопрос! Я думаю, что решение будет искажать изображение как параллелограмм. Рассмотрим изображение вывода карты, которое выглядит примерно так:
..X..
.XXX.
..X..
..|..
..|..
..|..
Где. является прозрачностью. Вы хотели бы исказить изображение, подобное этому для тени:
..X..
.XXX.
..X..
..|..
..|..
..|..
Обратите внимание, что верхняя и нижняя стороны имеют ту же ширину, что и в исходном изображении.