В моем приложении я разрешаю пользователю устанавливать цвет фона и изображения. Чтобы убедиться, что вся необходимая информация и значки видны, я использую текст с тенью разного цвета. Его легко установить, задав свойства тени в xml.

Однако я не смог найти способ нарисовать контур на векторном рисовании. Я нашел похожие вопросы, но ответы - более или менее рисовать прямоугольный или квадратный фон с тенью. В моем случае это выглядит слишком уродливо. Я хочу очертить фигуру вместо того, чтобы устанавливать квадратный фон с тенями.

3
mayank1513 23 Окт 2018 в 20:29

2 ответа

Лучший ответ

Я нашел уловку. На удивление все очень просто.

< Сильный > Ответ 1. Сделайте копию вектора для рисования - дайте ей имя diff. 2. Измените высоту и ширину в xml

<vector **android:height="28dp" android:width="28dp"**
    android:viewportHeight="24.0" android:viewportWidth="24.0" 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#56F0FF00" android:pathData="M1,21h4L5,9L1,9v12zM23,10c0,-1.1 -0.9,-2 -2,-2h-6.31l0.95,-4.57 0.03,-0.32c0,-0.41 -0.17,-0.79 -0.44,-1.06L14.17,1 7.59,7.59C7.22,7.95 7,8.45 7,9v10c0,1.1 0.9,2 2,2h9c0.83,0 1.54,-0.5 1.84,-1.22l3.02,-7.05c0.09,-0.23 0.14,-0.47 0.14,-0.73v-1.91l-0.01,-0.01L23,10z"/>
</vector>
  1. Теперь установите этот новый объект для рисования как фон (передний план, если размер нового объекта для рисования меньше исходного). Убедитесь, что вы используете правильное масштабирование, чтобы контур можно было рисовать.
1
mayank1513 24 Окт 2018 в 02:11

Нашел более чистый ответ.

Уловка в предыдущем ответе - установка вектора, который можно рисовать с увеличенным размером, так как фон может не всегда выглядеть очень красиво.

Другое решение - нарисовать растровое изображение с правильной тенью.

Следуйте этому вопросу, чтобы получить растровое изображение из векторной графики.

public static Bitmap getBitmapFromVectorDrawable(Context context, int drawableId) {
    Drawable drawable = ContextCompat.getDrawable(context, drawableId);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        drawable = (DrawableCompat.wrap(drawable)).mutate();
    }
    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
            drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

Теперь используйте следующий код, чтобы нарисовать фоновое растровое изображение.

Paint paint1 = new Paint();
paint1.setAlpha(155); // shadow alpha
Bitmap b = bitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas c = new Canvas(b);
c.drawBitmap(bitmap, 0, 0, paint1);
float r = 10*dp; // shadow thickness
int directions = 10;
for (int i = 0; i < directions; i++) {
    c.drawBitmap(bitmap, r * (float) Math.cos(2 * i * Math.PI / directions), r * (float) Math.sin(2* i * Math.PI / directions), paint1);
}

Чтобы сделать его еще лучше, вы можете использовать renderScript для размытия растрового изображения b в приведенном выше коде.

Теперь нарисуйте исходное растровое изображение поверх этого размытого / прозрачного растрового изображения.

0
mayank1513 11 Фев 2020 в 11:01
52954743