3

好吧,伙计们,这听起来可能很愚蠢,但我已经把头撞在键盘上一段时间了,现在试图弄清楚为什么它不会刷新。基础知识:我有一个小示例应用程序,我正在测试它是否可以将图像围绕一个点旋转 X 度数,并一次显示一个度数以制作流畅的动画。所以我有一个很棒的示例,我发现它与滑块配合得很好,基本上将图像旋转设置到滑块上的一个点,太棒了!但是....当我尝试使用随机数创建一个for循环并使用我的for变量沿每个度数更新图像时...它什么也没做...我得到的只是最后更新的图像...但是当我在他的滑块上拖动手指时,图形会在我旋转时立即更新...我无法弄清楚我在这里做错了什么...

本质上,如果你看这件作品,我再次在按钮后面做了同样的事情,但它不是“实时”做的。我打电话给 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);

   }
4

3 回答 3

1

我认为您所做的类似于:

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

这不起作用,因为invalidate()只在主线程事件队列中安排重绘。这意味着只有在当前代码全部执行完毕时才会执行重绘(在本例中为 for 循环)。

对于简单的旋转,补间动画会更适合。对于更高级的东西(如游戏动画),您可能需要创建自定义视图或使用SurfaceView.

于 2011-04-04T16:06:45.653 回答
0

我遇到了同样的问题,我用过:

runOnUiThread(new Runnable() {
    public void run() {
    myImageView.setImageBitmap(image);
    imageView.invalidate();
    }
});
于 2011-12-14T16:16:33.590 回答
0

听起来您正在使用代码阻止 UI 线程来旋转图像。

我现在没有任何代码可以给你看(回复一下,今晚我回家的时候我可以发布一些应该有帮助的东西),但是你可能会得到更好的结果,将你的旋转代码放在AsyncTask中,请参阅Painless Threading开发站点的区域以获取更多信息。

于 2011-04-04T16:01:00.440 回答