1

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

我尝试使用 TouchImageView(扩展 ImageView)实现全景查看器。首先,我尝试使用 TranslateAnimation,但也失败了(我的问题没有答案,所以我认为这对于 TouchImageView 是不可能的)。

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

问题是我只能在 4 或 5 秒后看到全景图的最终位置,什么也没有。我什至放了两个ImageView.invalidate();,没有任何成功。我尝试使用 Threads 和 AsyncTasks 也没有成功(问题是它们必须更新主 UI,否则我会得到一个异常;但在我看来使用 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();
    }
}

谢谢!!

4

1 回答 1

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();
    }
}
于 2012-12-21T00:46:15.943 回答