view.invalidate()无法重绘imageview

时间:2011-04-04 15:35:49

标签: android android-image

好吧,伙计们,这可能听起来很愚蠢,但是我一直在敲击键盘一段时间,现在试图找出为什么这不会刷新。基础知识:我有一个小样本应用程序,我正在测试,看看我是否可以旋转一个X度数点的图像,并一次显示一度,以制作一个平滑的动画。所以我有一个很棒的样本,我发现它适用于滑动条,基本上将图像旋转设置为滑块上的一个点,太棒了!但....当我尝试创建一个带有随机数的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);

   }

3 个答案:

答案 0 :(得分:1)

我认为你所做的是:

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

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

对于简单的轮换,Tween Animation更适合。对于更高级的内容(如游戏动画),您可能需要创建自定义视图或使用SurfaceView

答案 1 :(得分:0)

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

我现在没有任何代码可以显示给你(回复,当我今晚回家时,我可以发布一些应该有帮助的东西),但yuo可能会得到更好的结果,将你的轮换码放在{{3有关详细信息,请参阅开发站点的AsyncTask区域。

答案 2 :(得分:0)

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

runOnUiThread(new Runnable() {
    public void run() {
    myImageView.setImageBitmap(image);
    imageView.invalidate();
    }
});