view.invalidate() не работает для перерисовки изображения

Хорошо, ребята, это может звучать глупо, но я уже некоторое время бьюсь головой об клавиатуру, пытаясь понять, почему это не обновится. основы: у меня есть небольшой пример приложения, которое я тестирую, чтобы посмотреть, смогу ли я повернуть изображение вокруг точки на X градусов и показать его по одному градусу за раз, чтобы сделать плавную анимацию. Итак, у меня есть отличный пример, который я нашел, который прекрасно работает с ползунком, в основном, установив поворот изображения в точку на ползунке, отлично! но.... когда я пытаюсь создать цикл for со случайным числом и использовать переменную my для обновления изображения по пути каждый градус... он ничего не делает... и все, что я получаю, это обновленное изображение в конце... но когда я тяну палец на ползунок, изображение обновляется мгновенно, когда я его раскручиваю... Я не могу понять, что я делаю не так... вот код с ползунком... я не знаю у меня есть кусок, который создает случайное число и рисует его, но по сути я сделал это за нажатие кнопки

по сути, если вы посмотрите на этот фрагмент, я снова сделал то же самое за кнопкой, но он не делает это "в реальном времени". я вызвал view.invalidate() и view.postinvalidate(), чтобы попытаться форсировать его, но не...

 @Override
   public void onProgressChanged(SeekBar seekBar, int progress,
     boolean fromUser) {
    // TODO Auto-generated method stub
    curRotate = (float)progress;
    drawMatrix();
   }

private void drawMatrix(){

    Matrix matrix = new Matrix();
       matrix.postScale(curScale, curScale);
       matrix.postRotate(curRotate);

       Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
       myImageView.setImageBitmap(resizedBitmap);

   }

3 ответа

Я думаю, что вы сделали что-то вроде:

for (int degrees = 0 ; degrees < maxRotation ; i++) {
    // perform the rotation by matrix
    myImageView.invalidate();
}

Это не сработает, потому что invalidate() только планирует перерисовку в очереди событий основного потока. Это означает, что перерисовка будет выполняться только тогда, когда весь текущий код был выполнен (в этом случае цикл for).

Для простого поворота лучше всего подойдет анимация анимации. Для более сложных вещей (таких как игровая анимация) вам может понадобиться создать пользовательский вид или использовать SurfaceView,

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

У меня нет никакого кода, чтобы показать вам прямо сейчас (ответьте, и когда я сегодня вечером буду дома, я смогу опубликовать кое-что, что должно помочь), но вы, вероятно, получите лучшие результаты, поместив ваш код поворота в AsyncTask, см. Потоки без боли область сайта разработчика для получения дополнительной информации.

У меня была такая же проблема, я использовал:

runOnUiThread(new Runnable() {
    public void run() {
    myImageView.setImageBitmap(image);
    imageView.invalidate();
    }
});
Другие вопросы по тегам