我知道这个问题之前已经被多次回答了,但是这个新手找不到有效的答案。
我尝试使用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();
}
}
谢谢!
答案 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();
}
}