Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Performance_Bitmap_Drawing_Scale - Fatal编程技术网

Android 当缩放到高分辨率时,绘制位图速度较慢

Android 当缩放到高分辨率时,绘制位图速度较慢,android,performance,bitmap,drawing,scale,Android,Performance,Bitmap,Drawing,Scale,我有一个非常简单的任务要做,就是在自定义视图中绘制背景图像。我创建了一个位图并缩放它以适应视图的宽度和高度。这使得应用程序的速度慢了一半(我每10毫秒打印一次时间值来衡量性能的速度)。 代码如下: public class GView extends View { int w, h; Bitmap bg; int time = 0; boolean created = false; public GView(Context context) { super(context);

我有一个非常简单的任务要做,就是在自定义视图中绘制背景图像。我创建了一个位图并缩放它以适应视图的宽度和高度。这使得应用程序的速度慢了一半(我每10毫秒打印一次时间值来衡量性能的速度)。 代码如下:

public class GView extends View {

int w, h;
Bitmap bg;
int time = 0;

boolean created = false;
public GView(Context context) {
    super(context);
    bg = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);
    new Timer();
}

@Override
public void onDraw(Canvas c) {
    Paint p = new Paint();
    if(!created) {
        w=getWidth();
        h=getHeight();
        p.setColor(Color.RED);
        p.setTextSize(40);
        bg = Bitmap.createScaledBitmap(bg, w, h, false);
        created = true;
    }
    if(created) {
        time++;
        c.drawBitmap(bg, 0,0,null);
        c.drawText(time+"", (int)(w/4),  (int)(h/4), p);
    }

}

class Timer extends Handler {
    private Timer() {
        handleMessage(obtainMessage(0));
    }

    @Override
    public void handleMessage(Message m) {
        invalidate();
        sendMessageDelayed(obtainMessage(0), 10);
    }
}
}

仅供参考,原始图像为300x225。我缩放图像的平板电脑屏幕分辨率为1280x800。 问题是,如果我将背景图像缩放为(int)(.8*w),(int)(.8*h)或更小的值,或者根本不缩放图像,那么它会像预期的那样快速运行

我尝试使用ImageView和setImageResource(R.drawable.my_image),但速度还是一样慢。 我认为对于任何编程语言来说,绘制一幅适合背景的图像都应该非常简单,但即使在进行了大量搜索之后,我也有过很长时间的这个问题。我希望有人能给我一个正确的答案。非常感谢。

不应在onDraw()例程中执行createScaledBitmap()。它非常慢,因为它使用像素平均例程来“平滑”拉伸的位图。在gui线程之外创建拉伸位图,然后在onDraw()方法中绘制它(canvas.drawBitmap)。如果设置为false,则可以使用过滤器参数创建“最近邻”缩放。这看起来“块状”,但处理速度要快得多

public static Bitmap createScaledBitmap
  (Bitmap src, int dstWidth, int dstHeight, boolean filter)
我在onDraw()中调用createScaledBitmap(),因为那时我可以获得视图的宽度和高度。我只使用if(!created)然后call调用它一次,然后设置为created=true,然后再也不调用createScaledBitmap()。所以这并不坏。但是,我仍然尝试在构造函数中调用它,但没有区别。