view.invalidate () не работает для перерисовки изображения - PullRequest
2 голосов
/ 04 апреля 2011

Хорошо, ребята, это может звучать глупо, но я уже некоторое время стучу головой о клавиатуру, пытаясь понять, почему это не обновится. основы: у меня есть небольшой пример приложения, которое я тестирую, чтобы увидеть, могу ли я повернуть изображение вокруг точки на 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 ]

1 голос
/ 04 апреля 2011

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

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

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

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

0 голосов
/ 14 декабря 2011

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

runOnUiThread(new Runnable() {
    public void run() {
    myImageView.setImageBitmap(image);
    imageView.invalidate();
    }
});
0 голосов
/ 04 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...