Прокрутка Холста гладко в Android

Я плохо знаком с Android.

Я тяну битовые массивы, строки и формы на Холст в OnDraw (Холст холста) метод моего представления. Я ищу справку о том, как реализовать гладкую прокрутку в ответ на перетаскивание пользователем. Я искал, но не нашел, что любые учебные руководства помогают мне с этим.

Ссылка для Холста, кажется, говорит, что, если Холст создается из Битового массива (названный bmpBuffer, скажите), затем что-либо продвинутое, Холст также продвинут bmpBuffer. Было бы возможно использовать bmpBuffer для реализации прокрутки..., возможно, копируют его назад в Холст, смещенный на несколько пикселей за один раз? Но если я использую Canvas.drawBitmap для отодвижения bmpBuffer к Холсту, смещенному на несколько пикселей, не будет bmpBuffer быть поврежденным? Возможно, поэтому, я должен скопировать bmpBuffer в bmpBuffer2, затем отодвигают bmpBuffer2 к Холсту.

Более простой подход должен был бы провести линии, формы, и т.д. прямо в буферный Битовый массив затем тянут тот буфер (со сдвигом) на Холст, но насколько я вижу различные методы: drawLine (), drawShape () и так далее не доступны для рисования к Битовому массиву... только к Холсту.

У меня могло быть 2 Холста? Один из которых создавался бы из буферного битового массива и использовался бы просто для того, чтобы построить графики, формы, и т.д. и затем буферный битовый массив будет оттянут на другой Холст для дисплея в Представлении?

Я должен приветствовать любой совет!

Ответы на подобные вопросы здесь (и на других веб-сайтах) относятся к "блитированию". Я понимаю понятие, но ничего не могу найти о "копировании битового массива" или "пересылке битовой строки" в документации Android. Canvas.drawBitmap и Битовый массив. Скопировать эквиваленты Android?

24
задан Loktar 7 July 2014 в 19:58
поделиться

3 ответа

У меня тоже была эта проблема,

Я рисовал следующим образом:

Canvas BigCanvas = new Canvas();
Bitmap BigBitmap = new Bitmap(width,height);

int ScrollPosX , ScrollPosY  // (calculate these with the onScrollEvent handler)

void onCreate()
{
   BigCanvas.SetBitmap(BigBitmap);
}

onDraw(Canvas TargetCanvas)
{
   // do drawing stuff
   // ie.  BigCanvas.Draw.... line/bitmap/anything

   //draw to the screen with the scrolloffset

   //drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)
   TargetCanvas.DrawBitmap(BigBitmap(new Rect(ScrollPosX,ScrollPosY,ScrollPosX + BigBitmap.getWidth(),ScrollPosY + BigBitmap.getHeight(),new Rect(0,0,ScreenWidth,ScreenHeight),null);
}

для плавной прокрутки вам нужно было бы использовать какой-то метод, который занимает несколько точек после прокрутки (т.е. первая точка прокрутки и 10-й), вычтите их и прокрутите на это число в каждом цикле, что делает его постепенно медленнее (ScrollAmount - повороты - трение).

Надеюсь, это поможет лучше понять ситуацию.

1
ответ дан 29 November 2019 в 00:25
поделиться

Я, кажется, нашел ответ. Я поставил основную часть кода чертежа (который ранее был в OnDaraw ()) в новом методе Dodrawing (). Этот метод начинается с создания нового растрового изображения больше, чем экран (достаточно большой, чтобы удерживать полный рисунок). Затем он создает второе холст, на котором необходимо сделать подробный рисунок:

    BufferBitmap = Bitmap.createBitmap(1000, 1000, Bitmap.Config.ARGB_8888);
    Canvas BufferCanvas = new Canvas(BufferBitmap);

Остальная часть метода Dodrawing () приводится в действие с подробным рисунком для буффанванва.

Весь метод OnDaw () теперь читает следующим образом:

    @Override protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(BufferBitmap, (float) -posX, (float) -posY, null);
}

Переменные положения, posx и posy, инициализированные при 0 в методе oncreate () приложения. Приложение реализует вступление вггерелистенер и использует расставленные рассеивания и рассмотренные аргументы, возвращаемые в уведомлении о скобре, чтобы увеличить POSX и Posy.

Это, кажется, обо всем, что нужно для реализации плавного прокрутки. Или я заглянул что-то!?

12
ответ дан 29 November 2019 в 00:25
поделиться

prepbgg: Я не думаю, что код будет работать, потому что canvas.drawBitmap не рисует в битмап, а рисует битмап на холсте.

Поправьте меня, если я ошибаюсь!

0
ответ дан 29 November 2019 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: