Вставить XML-изображение на свой canvas (android)
Имеется XML-изображение находящееся в папке ресурсов drawable. Также я создал canvas, на котором хочу разместить изображение из файла ресурсов. Когда использовал png-файл, то все было нормально - я писал:
val imagePNG = BitmapFactory.decodeResource(resources, R.drawable.info)
canvas.drawBitmap(
imagePNG,
null,
// квадрат со стороной 50, поэтому делаем смещение на 25
// чтобы центр круга с буквой был в нужной координате
Rect(
coordX.toInt() - 25,
coordY.toInt() - 25,
(coordX - 25 + width / 20).toInt(),
(coordY - 25 + width / 20).toInt()
),
null
)
И картинка размещалась по нужным мне координатам. Теперь я имею xml-файл в папке drawable
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="256dp"
android:height="256dp"
android:viewportWidth="256"
android:viewportHeight="256">
<path
android:pathData="M245.4,131.32C245.4,195.1 193.7,246.8 129.92,246.8C66.14,246.8 14.44,195.1 14.44,131.32C14.44,67.54 66.14,15.84 129.92,15.84C193.7,15.84 245.4,67.54 245.4,131.32L245.4,131.32z"
android:strokeLineJoin="round"
android:strokeWidth="0.1"
android:strokeColor="#00000000"
android:strokeLineCap="butt">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="129.92"
android:centerY="131.32"
android:gradientRadius="115.48"
android:type="radial">
<item android:offset="0" android:color="#50000000"/>
<item android:offset="0.93" android:color="#32000000"/>
<item android:offset="1" android:color="#00000000"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M235,128C235,187.09 187.09,235 128,235C68.91,235 21,187.09 21,128C21,68.91 68.91,21 128,21C187.09,21 235,68.91 235,128L235,128z"
android:strokeLineJoin="round"
android:strokeWidth="0.11"
android:fillColor="#3a73ef"
android:strokeColor="#00000000"
android:strokeLineCap="butt"/>
<path
android:pathData="M231,128C231,184.89 184.89,231 128,231C71.11,231 25,184.89 25,128C25,71.11 71.11,25 128,25C184.89,25 231,71.11 231,128L231,128z"
android:strokeLineJoin="round"
android:strokeWidth="0.1"
android:strokeColor="#00000000"
android:strokeLineCap="butt">
<aapt:attr name="android:fillColor">
<gradient
android:startX="159.74"
android:startY="225.68"
android:endX="96.26"
android:endY="30.32"
android:type="linear">
<item android:offset="0" android:color="#F1FFFFFF"/>
<item android:offset="1" android:color="#BDFFFFFF"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M222,128C222,179.91 179.91,222 128,222C76.09,222 34,179.91 34,128C34,76.09 76.09,34 128,34C179.91,34 222,76.09 222,128L222,128z"
android:strokeLineJoin="round"
android:strokeWidth="0.1"
android:strokeColor="#00000000"
android:strokeLineCap="butt">
<aapt:attr name="android:fillColor">
<gradient
android:startX="163.48"
android:startY="215.82"
android:endX="92.52"
android:endY="40.18"
android:type="linear">
<item android:offset="0" android:color="#FF2A4FE4"/>
<item android:offset="0.2" android:color="#FF447BFA"/>
<item android:offset="0.63" android:color="#FF69A3FF"/>
<item android:offset="0.75" android:color="#FF89BEFF"/>
<item android:offset="1" android:color="#FF80BEFF"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M123.31,191.08C129.02,187.76 138.24,176.49 141.67,168.66C141.67,168.66 138.14,167.16 138.14,167.16C131.04,179.58 120.03,188.7 123.71,173.32C123.71,173.32 145.46,105.05 145.46,105.05C139.78,104.58 111,109.18 106.51,110.1C106.51,110.1 105.8,113.88 105.8,113.88C115.61,114.22 116.95,118.23 116.24,121.52C116.24,121.52 99.93,173.58 99.93,173.58C99.93,173.58 97.88,179.46 97.95,183.85C98.11,193.86 111.11,197.71 123.31,191.08z"
android:strokeWidth="0.1"
android:fillColor="#ffffff"
android:strokeColor="#00000000"/>
<path
android:pathData="M151.68,75.84C151.68,83.51 145.46,89.73 137.79,89.73C130.12,89.73 123.9,83.51 123.9,75.84C123.9,68.17 130.12,61.94 137.79,61.94C145.46,61.94 151.68,68.17 151.68,75.84L151.68,75.84z"
android:strokeLineJoin="round"
android:strokeWidth="0.1"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:strokeLineCap="butt"/>
<path
android:pathData="M128,31.59C86.87,31.59 51.75,57.4 37.91,93.69C56.73,110.36 96.25,118.37 128.03,118.63C128.07,118.62 128.02,118.63 128.06,118.63C160.1,118.37 199.12,109.68 217.72,92.69C203.62,56.92 168.75,31.59 128,31.59z"
android:strokeAlpha="0.45"
android:strokeLineJoin="miter"
android:strokeWidth="0.1"
android:fillAlpha="0.45"
android:strokeColor="#00000000"
android:fillType="evenOdd"
android:strokeLineCap="butt">
<aapt:attr name="android:fillColor">
<gradient
android:startX="127.81"
android:startY="31.59"
android:endX="127.81"
android:endY="118.63"
android:type="linear">
<item android:offset="0" android:color="#FFFFFFFF"/>
<item android:offset="1" android:color="#96FFFFFF"/>
</gradient>
</aapt:attr>
</path>
</vector>
Вроде все перерыл, но так и не получилось нарисовать данный рисунок на canvas'е. Как нужно было сделать правильно? Или же вопрос можно поставить так - как разместить векторный рисунок на canvas'е? Буду благодарен за помощь.
Ответы (1 шт):
Спасибо за подсказку от Eugene Krivenja. Благодаря его помощи я решил свой вопрос следующим образом: Имеется XML-файл
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="50dp"
android:height="50dp"
android:viewportWidth="50"
android:viewportHeight="50">
<path
android:pathData="M49.228,25.087A24.217,24.228 90.003,1 1,0.772 25.087A24.217,24.228 90.003,1 1,49.228 25.087z"
android:strokeWidth="1.544"
android:fillColor="#0561F5"
android:strokeColor="#00000000"
android:fillAlpha="0.67284"
android:strokeLineCap="square"/>
<path
android:pathData="M19.591,36.808A17.723,20.409 87.564,1 1,24.5 37.384"
android:strokeWidth="1.52721"
android:strokeColor="#00000000"
android:strokeLineCap="square">
<aapt:attr name="android:fillColor">
<gradient
android:startX="22.931"
android:startY="-25.428"
android:endX="24.992"
android:endY="44.215"
android:type="linear">
<item android:offset="0" android:color="#FFFFFFFF"/>
<item android:offset="1" android:color="#00FFFFFF"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M29.9,22.287C29.627,22.921 24.619,33.168 23.985,35.523C22.79,39.96 29.51,37.953 29.584,37.338C26.442,41.524 20.167,43.553 16.786,38.539C15.954,32.151 20.802,27.573 22.376,21.519C22.815,19.435 17.607,20.837 18.508,19.587C22.069,18.093 31.194,16.207 29.9,22.287z"
android:strokeWidth="0.999641"
android:fillColor="#ffffff"
android:strokeColor="#000000"
android:strokeLineCap="square"/>
<path
android:pathData="M33.549,12.878A3.613,3.6 90,1 1,26.348 12.878A3.613,3.6 90,1 1,33.549 12.878z"
android:strokeWidth="1"
android:fillColor="#ffffff"
android:strokeColor="#000000"
android:strokeLineCap="square"/>
</vector>
Для того, что бы вывести его на canvas в нужных координатах и нужного размера я писал следующий код:
val myBitmap = ContextCompat.getDrawable(context, R.drawable.infosvg)
myBitmap?.setBounds(
coordX.toInt() - 25,
coordY.toInt() - 25,
(coordX - 25 + width / 20).toInt(),
(coordY - 25 + width / 20).toInt()
)
myBitmap?.draw(canvas)
Все получилось так, как мне было нужно