再一次:为什么我的ImageView没有刷新?

时间:2012-12-20 23:19:39

标签: android imageview invalidation translate-animation

我知道这个问题之前已经被多次回答了,但是这个新手找不到有效的答案。

我尝试使用TouchImageView(扩展ImageView)实现全景查看器。首先我尝试使用TranslateAnimation,但也失败了(我的问题得到no answers,所以我认为TouchImageView无法做到这一点。)

然后我用艰难的方式尝试,使用ImageView.matrix,移动一点,暂停,移动一点,停顿......好吧,至少那是我的想法。

问题是我只能在4或5秒后看到全景处于最终位置。我甚至放了两个ImageView.invalidate();,没有任何成功。我尝试使用Threads和AsyncTasks也没有成功(问题是他们必须更新主UI,否则我得到一个Exception;但是我使用AsyncTask更新UI线程看起来不对)。好吧,我尝试了我能想到的一切。

无论如何,下面是我的简单代码(AsyncTask尝试,但我在里面做的一切)。观察foto.invalidate();方法中未遵循的onPreExecute(为什么?)。有一些行评论给你看看我尝试了什么。

我的简单代码,其中foto是(Touch)ImageView:

class animatepanorama extends AsyncTask<Void, Void, Void> {
    float scale = foto.cropScale * foto.baseScale;
    Matrix m = foto.matrix;
    protected void onPreExecute(Void arg0) {
        m.setScale(scale, scale);
        foto.Scale = foto.cropScale;
        foto.setImageMatrix(m);
        foto.invalidate();
    }
    @Override
    protected Void doInBackground(Void... arg0) {
        // new Thread(new Runnable() { public void run() {
        //synchronized(foto) {
        runOnUiThread(new Runnable() {
            public void run() {
                for (int i = 0; i < 100; i++) {

                    try {
                        Thread.sleep(25);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    m.setScale(scale, scale);
                    m.postTranslate(-i * scale * 8, 0);
                    foto.setImageMatrix(m);
                    foto.invalidate();
                }
            }
        });
        //}
        // }}).start();
        return null;
    }
    protected void onPostExecute(Void arg0) {
        foto.invalidate();
    }
}

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试而不是在UI线程上从doinbackground运行它,使用publishProgress和onProgressUpdate?问题是doinbackground不在uithread上运行但在“后台”运行,因此对于所有UI更新,它必须将此传递给onprogressupdate。

将您的异步更改为:

class animatepanorama extends AsyncTask<Void, Integer, Void> {

然后可以使用Integer参数调用onProgressUpdate

 for (int i = 0; i < 100; i++) {

        try {
            Thread.sleep(25);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        publishProgress(0);

    }

并覆盖此:

@Override
protected void onProgressUpdate(Integer... values) {
    if (values[0] == 0) {
        m.setScale(scale, scale);
        m.postTranslate(-i * scale * 8, 0);
        foto.setImageMatrix(m);
        foto.invalidate();
    }
}