Android-позиционирование и настройка холста - PullRequest
1 голос
/ 25 марта 2019

Итак, это мой сценарий:

  • У меня есть изображение 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

Так что я знаю, что мой код неверен (яЯ довольно новичок в Canvas в Android и пытаюсь выяснить, что делать), и что я узнал до сих пор:

  • , что для выбора части изображения мне нужно преобразовать егов растровое изображение (я не нашел никакого способа сделать это напрямую с помощью VectorDrawable)
  • При рисовании растрового изображения на холсте с помощью DrawBitmap, первый объект Rect представляет область, которую я хочу показать, а второйОдним из них является размер и положение отображаемой области.
  • Чтобы растровое изображение отображалось на холсте, мне нужно создать холст из растрового изображения и нарисовать его в нем, чтобы оно отображалось.Это правильно?

Поэтому у меня есть несколько вопросов:

  • Я хотел бы понять, как выровнять изображения по вертикали, чтобы они начинались с того же y (Топ).
  • Я не уверен, что векторное изображение - лучшая идея, может быть, лучше преобразовать его в png, зависящие от дисплея?Или в любом случае размер холста относительно экрана?Или, может быть, мне нужно, чтобы мой код не зависел от экрана (я полагаю, что getIntrinsicWidth / Height возвращают реальный размер изображения, поэтому, возможно, мне нужно его масштабировать?)
  • Почему мне нужно явно установить границы обоихизображения для их отображения?

ОБНОВЛЕНИЕ # 1

Итак, я понял, почему мои изображения не выровнены по одной линии.Похоже, что при создании векторного актива, по какой-то причине размеры «адаптированы», не уверен, что это делает система Android или студия Android.Но в любом случае после загрузки двух изображений с одинаковой высотой в пикселях я обнаружил, что для одного у меня есть высота, а для другого - другая высота (почти вдвое), и это объясняет, почему изображение смещено снизу.,

Итак, я попытался создать одно изображение как с заметками, так и с ключами, и это вроде работает в эмуляторе.Но при тестировании на реальном устройстве я получаю сообщение об ошибке:

W / OpenGLRenderer: растровое изображение слишком большое для загрузки в текстуру (11732x1168, max = 8192x8192) растровое изображение слишком большое для загрузки в текстуру(11732x1168, max = 8192x8192)

Я могу понять, что означает ошибка, но в любом случае размер изображения в пикселях: 2933x292 пикселей.Почему getIntrinsicWidth и getIntrinsicHeight возвращают эти измерения?каковы их метрики?

Мне интересно, что, возможно, векторное рисование не лучший выбор?Может быть, лучше превратить его в png-файлы, зависящие от экрана?и использовать их?

...