Intereting Posts
Как установить дополнение для виджета CardView в Android L Android: получать все уведомления по коду Просмотреть getX () и getY () вернуть 0.0 после того, как они были добавлены в Activity Не удается найти манифест, определяемый получателем ~ 1% от времени Создайте приложение для Android, которое действует как ярлык для нашего мобильного сайта Android – создание CSV-файла из значений таблицы Онлайн-приложение для потокового радио для Android Multi-touch кросс-платформенный Java-приложение (Windows, Mac и Linux (Ubuntu) (возможно, Android)) Не удается обновить Android Studio – скачать только Как протестировать BOOT_COMPLETED широковещательный приемник в эмуляторе Android: ошибка com.parse.ParseException: в этой операции должно быть указано как минимум одно поле ID (installationId, deviceToken) Как нарисовать путь на карте с помощью файла kml? Список отступов в TextView Как определить, является ли какая-либо из моих операций самой фронтальной и видимой для пользователя? Проверьте метод onReceivedSslError () WebViewClient, если сертификат подписан из определенного самозаверяющего ЦС

Прокрутка холста плавно в Android

Я новичок в Android.

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

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

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

Могу ли я иметь 2 холста? Один из них будет построен из битового массива буфера и использован просто для построения линий, фигур и т. Д., А затем бит-карта буфера будет нарисована на другой холст для отображения в представлении?

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

Ответы на подобные вопросы здесь (и на других веб-сайтах) относятся к «blitting». Я понимаю концепцию, но ничего не могу найти о «blit» или «bitblt» в документации на Android. Являются ли Canvas.drawBitmap и Bitmap.Copy эквивалентами Android?

Solutions Collecting From Web of "Прокрутка холста плавно в Android"

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

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

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 – повороты – трение).

Надеюсь, это даст больше понимания.

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

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

Остальная часть метода doDrawing () рассматривается с подробным чертежом в BufferCanvas.

Теперь весь метод onDraw () выглядит следующим образом:

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

Переменные позиции, posX и posY, инициализируются в 0 в методе onCreate () приложения. Приложение реализует OnGestureListener и использует аргументы distanceX и distanceY, возвращаемые в уведомлении OnScroll, для увеличения posX и posY.

Это похоже на все, что необходимо для обеспечения плавной прокрутки. Или я слишком-то смотрю !?

Продолжение ответа Виктору …

На самом деле ситуация сложнее. Поскольку процесс doDrawing довольно медленный (занимает 2-3 секунды на моем медленном старом телефоне HTC Hero), мне показалось желательным вывести сообщение Toast, чтобы сообщить пользователю, что это происходит, и указать причину. Очевидным способом сделать это было создание нового метода, содержащего только 2 строки:

 public void redrawBuffer(String strReason) { Toaster.Toast(strReason, "Short");` doDrawing(); } 

И вызвать этот метод из других мест в моей программе вместо doDrawing ().

Однако я обнаружил, что Тостер либо никогда не появлялся, либо не вспыхивал так кратко, что его нельзя было прочитать. Моим обходным путем было использовать обработчик проверки времени, чтобы заставить программу спать в течение 200 миллисекунд между отображением Toast и вызовом doDrawing (). Хотя это немного задерживает начало перерисовки, я чувствую, что это цена, которая стоит платить с точки зрения удобства использования программы, потому что пользователь знает, что происходит. ReDrawBuffer () теперь читает:

 public void redrawBuffer(String strReason) { Toaster.Toast(strReason, "Short"); mTimeCheckHandler.sleep(200); }` 

И код обработчика (который вложен в мой класс View):

 private timeCheckHandler mTimeCheckHandler = new timeCheckHandler(); class timeCheckHandler extends Handler { @Override public void handleMessage(Message msg) { doDrawing(); } public void sleep(long delayMillis) { this.removeMessages(0); sendMessageDelayed(obtainMessage(0), delayMillis); } }` 

Не нужно перезапускать активность! (Ответ на ответ от 27 января 10 ответ на его ответ 17 января 10). Вместо того, чтобы перерабатывать растровое изображение и налагать накладные расходы на перезагрузку, вы можете избежать загрузки приложения, добавив атрибут «android: configChanges», показанный ниже, В элементе «activity» файла AndroidManifest.xml для приложения. Это сообщает системе, что приложение будет обрабатывать изменения ориентации и не требует перезапуска приложения.

 <activity android:name=".ANote" android:label="@string/app_name" android:configChanges="orientation|screenLayout"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 

Этот метод можно использовать для получения уведомления при изменении назначения:

 public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); prt("onConfigurationChanged: "+newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { prt(" PORTRAIT"); } else { prt(" LANDSCAPE"); } } // end of onConfigurationChanged 

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

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