Как эффективно установить Bitmap в Canvas? - PullRequest
0 голосов
/ 10 октября 2018

Я использую Android WallpaperService для реализации функции автоматического изменения обоев в моем приложении.Итак, после долгих исследований и пробных ошибок, я нашел решение, которое работает так, как я хотел.Но основная проблема с моей реализацией заключается в том, что она потребляет много энергии аккумулятора.Особенно, когда пользователь выбирает наименьший период времени (например, 5 минут).Мое приложение находится в топ-3 в списке самых высоких потребителей батареи.Итак, есть ли какой-нибудь альтернативный способ или улучшение в моем коде, которое значительно уменьшит потребление батареи?

Я публикую только часть кода, которая изменяет Bitmap of Canvas:

//Loading Bitmap from Storage, path is File variable
bitmap = BitmapFactory.decodeFile(path.getPath() + "/" + fileNames[index]);
canvas = holder.lockCanvas();
canvas.save();
int width = bitmap.getWidth();
int height = bitmap.getHeight();
WindowManager windowManager =
        (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
if (windowManager != null) {
    //This part will get height and width of actual device screen(Resolution) if soft buttons are present
    final Display display = windowManager.getDefaultDisplay();
    Point outPoint = new Point();
    if (Build.VERSION.SDK_INT >= 19) {
        // include navigation bar
        display.getRealSize(outPoint);
    } else {
        // exclude navigation bar
        display.getSize(outPoint);
    }
    maxHeight = outPoint.y;
    maxWidth = outPoint.x;
} else {
    maxWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
    maxHeight = Resources.getSystem().getDisplayMetrics().heightPixels;
}
if (width > height) {
    //Crops Image to match the ratio of device resolution
    // landscape
    bitmap = Bitmap.createBitmap(
            bitmap,
            bitmap.getWidth() / 2 - bitmap.getHeight() / 2,
            0,
            bitmap.getHeight(),
            bitmap.getHeight()
    );
    float widthratio = (float) bitmap.getHeight() / maxHeight;
    width = (int) (bitmap.getWidth() / widthratio);
    height = maxHeight;
} else if (height > width) {
    // portrait
    float ratio;
    float heightratio = (float) width / maxWidth;
    height = (int) (height / heightratio);
    width = maxWidth;
    if (height < maxHeight) {
        ratio = (float) height / maxHeight;
        height = maxHeight;
        width = (int) (width / ratio);
    }
} else {
    // square
    height = maxHeight;
    width = maxWidth;
}
canvas.scale(1, 1);
//Scale the bitmap to match the resolution of device screen
bitmap = Bitmap.createScaledBitmap(bitmap, (int) (width), (int) (height), false);
//Drawing Image in Canvas
canvas.drawBitmap(bitmap, 0, 0, null);
bitmap.recycle();
bitmap = null;
canvas.restore();
holder.unlockCanvasAndPost(canvas);
handler.removeCallbacks(drawImage);
//Delaying handler as per user's preferenced time period
handler.postDelayed(drawImage, preferences.getInt("TIMETOCHANGEBACHGROUND", 3600) * 1000);
canvas.setBitmap(null);
...