Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 逐角度旋转图像并等待刷新_Android_Multithreading_View_Rotation_Runnable - Fatal编程技术网

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在此处选择其中一个教程()。