Android 逐角度旋转图像并等待刷新
我试着旋转一个图像,一次旋转一个小角度 每次进行的旋转应在显示上一个旋转后开始 旋转的速度对我来说毫无意义——只要每次旋转都显示出来,我就可以了。这意味着它实际上可以被认为是“太快了” 我尝试了几种不同的方法。下面我有一个可行的解决方案(至少是这样的——我一直在玩代码,所以它可能不完全可编译)Android 逐角度旋转图像并等待刷新,android,multithreading,view,rotation,runnable,Android,Multithreading,View,Rotation,Runnable,我试着旋转一个图像,一次旋转一个小角度 每次进行的旋转应在显示上一个旋转后开始 旋转的速度对我来说毫无意义——只要每次旋转都显示出来,我就可以了。这意味着它实际上可以被认为是“太快了” 我尝试了几种不同的方法。下面我有一个可行的解决方案(至少是这样的——我一直在玩代码,所以它可能不完全可编译) handler是一个处理程序实例,它与下面位于我开始的活动类主体中的所有代码一起rotationIncrement为0.36,因此我们通过在每次完成前一次旋转时向UI线程发布一个新的Runnable来“旋
handler
是一个处理程序实例,它与下面位于我开始的活动类主体中的所有代码一起rotationIncrement
为0.36,因此我们通过在每次完成前一次旋转时向UI线程发布一个新的Runnable来“旋转”图像1000次
public void start(View view) {
MainActivity.rotation=0;
imageview.setScaleType(ScaleType.MATRIX);
handler.post(new RotationRunnable());
}
public class RotationRunnable implements Runnable {
@Override
public void run() {
MainActivity.rotation+=rotationIncrement;
//Log.d("Rotating", String.valueOf(rotation));
Matrix matrix = new Matrix(imageview.getImageMatrix());
matrix.setRotate(rotation);
imageview.setImageMatrix(matrix);
imageview.invalidate();
if (MainActivity.rotation<360) {
handler.post(new RotationRunnable());
} else {
Log.d("Elapsed", String.valueOf((System.nanoTime()-startTime)));
}
}
}
公共作废开始(视图){
MainActivity.rotation=0;
imageview.setScaleType(ScaleType.MATRIX);
post(新的RotationRunnable());
}
公共类RotationRunnable实现Runnable{
@凌驾
公开募捐{
MainActivity.rotation+=旋转增量;
//Log.d(“旋转”,String.valueOf(旋转));
矩阵=新矩阵(imageview.getImageMatrix());
矩阵。设置旋转(旋转);
设置图像矩阵(矩阵);
imageview.invalidate();
if(MainActivity.rotation)这几乎是您将要获得的最快速度。您可以获得的最快刷新是一帧到另一帧。假设每秒60帧。1000/60=16.67秒。除非您找到提高帧速率的方法(我对此表示怀疑)或者减少旋转次数,就不可能减少时间。如果每次旋转1度,那就给你6秒。我不确定你怎么会不在乎速度-它是否显示在屏幕上?如果是,你将它设置为足够慢,让用户可以看到它。如果不是,你可以旋转它并绘制到位图,而不是屏幕上这将快几个数量级。@Aswin,这是我没有想到的,谢谢。两个后续问题;1)可能是一个愚蠢的问题,但是,考虑到未来一代手机可以处理每秒600帧。有没有办法测试这种情况?2)有没有一种简单的方法使计算更加密集,使帧率大幅下降?@ Poyan,你可以通过上面的方法做一秒钟的测试,看看有多少次迭代。您通过查看找到了帧速率。一旦您找到了fps,您就可以更好地猜测计算时间。有许多方法可以将帧速率限制在某个数字,以使计算更可预测。一种方法是游戏中常用的方法。您可以搜索控制帧速率的android游戏循环机制。Ch在此处选择其中一个教程()。