Итак, это мой сценарий:
- У меня есть изображение svg, которое содержит все музыкальные заметки на персонале (вид спрайтов)
- У меня есть два изображения svg, которыесодержит ключ (возможно, я могу объединить их вместе в любом случае)
Все они преобразуются в Android Vector Drawable.
Что я хочу сделать, это выбрать заметку из первогоSVG, выберите ключ, а затем показать их рядом друг с другом (два изображения должны быть выровнены).
Итак, чего мне удалось добиться, так это выбрать часть svg для заметки (мне нужно уточнить размер прямоугольника).Но у меня все еще проблема в том, чтобы показать их обоих в одной строке.
public MusicScore(Context context) {
super(context);
paint = new Paint();
paint.setColor(Color.BLACK);
Resources res = context.getResources();
musicClef = (VectorDrawable) res.getDrawable(R.drawable.ic_bassclef, null);
musicNotes = (VectorDrawable) res.getDrawable(R.drawable.ic_musicnotes, null);
int width = getWidth();
int height = getHeight();
Log.i("MUSIC", "H: " + musicClef.getMinimumHeight() + " W: " + musicClef.getMinimumWidth());
}
@Override
protected void onDraw(Canvas canvas){
Log.i("MUSIC", "Called");
int left = getWidth()/2;
int top = getHeight()/2;
musicClef.setBounds(0,0,musicClef.getIntrinsicWidth(), musicClef.getIntrinsicHeight() );
Bitmap source = Bitmap.createBitmap(musicNotes.getIntrinsicWidth(), musicNotes.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Bitmap clefSource = Bitmap.createBitmap(musicClef.getIntrinsicWidth(), musicClef.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas newcanvas = new Canvas(source);
Canvas clefCanvas = new Canvas(clefSource);
int notesLeft = musicClef.getIntrinsicWidth();
int notesTop = musicClef.getIntrinsicHeight();
musicNotes.setBounds(0, 0, musicNotes.getIntrinsicWidth(), musicNotes.getIntrinsicHeight());
musicNotes.draw(newcanvas);
musicClef.draw(clefCanvas);
Rect rect = new Rect(1150,0,1700, musicNotes.getIntrinsicHeight());
Rect rect2 = new Rect(notesLeft ,0, notesLeft + 450, musicNotes.getIntrinsicHeight());
Rect clefRect = new Rect(0, 0, musicClef.getIntrinsicWidth(), musicClef.getIntrinsicHeight());
canvas.drawBitmap(clefSource, null, clefRect, null);
canvas.drawBitmap(source, rect, rect2, null);
}
Итак, с помощью этого кода я могу показать часть заметок, которые можно нарисовать, преобразовав их в растровое изображение.И я также могу нарисовать их обоих, и горизонтальное положение выровнено.Проблема в том, что вертикальная позиция не выровнена, что я получаю:
![current output](https://i.stack.imgur.com/RJ0EQ.png)
Так что я знаю, что мой код неверен (яЯ довольно новичок в Canvas в Android и пытаюсь выяснить, что делать), и что я узнал до сих пор:
- , что для выбора части изображения мне нужно преобразовать егов растровое изображение (я не нашел никакого способа сделать это напрямую с помощью VectorDrawable)
- При рисовании растрового изображения на холсте с помощью DrawBitmap, первый объект Rect представляет область, которую я хочу показать, а второйОдним из них является размер и положение отображаемой области.
- Чтобы растровое изображение отображалось на холсте, мне нужно создать холст из растрового изображения и нарисовать его в нем, чтобы оно отображалось.Это правильно?
Поэтому у меня есть несколько вопросов:
- Я хотел бы понять, как выровнять изображения по вертикали, чтобы они начинались с того же y (Топ).
- Я не уверен, что векторное изображение - лучшая идея, может быть, лучше преобразовать его в png, зависящие от дисплея?Или в любом случае размер холста относительно экрана?Или, может быть, мне нужно, чтобы мой код не зависел от экрана (я полагаю, что getIntrinsicWidth / Height возвращают реальный размер изображения, поэтому, возможно, мне нужно его масштабировать?)
- Почему мне нужно явно установить границы обоихизображения для их отображения?
ОБНОВЛЕНИЕ # 1
Итак, я понял, почему мои изображения не выровнены по одной линии.Похоже, что при создании векторного актива, по какой-то причине размеры «адаптированы», не уверен, что это делает система Android или студия Android.Но в любом случае после загрузки двух изображений с одинаковой высотой в пикселях я обнаружил, что для одного у меня есть высота, а для другого - другая высота (почти вдвое), и это объясняет, почему изображение смещено снизу.,
Итак, я попытался создать одно изображение как с заметками, так и с ключами, и это вроде работает в эмуляторе.Но при тестировании на реальном устройстве я получаю сообщение об ошибке:
W / OpenGLRenderer: растровое изображение слишком большое для загрузки в текстуру (11732x1168, max = 8192x8192) растровое изображение слишком большое для загрузки в текстуру(11732x1168, max = 8192x8192)
Я могу понять, что означает ошибка, но в любом случае размер изображения в пикселях: 2933x292 пикселей.Почему getIntrinsicWidth и getIntrinsicHeight возвращают эти измерения?каковы их метрики?
Мне интересно, что, возможно, векторное рисование не лучший выбор?Может быть, лучше превратить его в png-файлы, зависящие от экрана?и использовать их?