За основу я взял тот же тестовый проект, что и в прошлый раз - TestAnimatedWidget. Добавил в него третий режим эмуляции анимации:
private enum tmodes {
MODE_PASS_BITMAP_ID //setImageViewResource
, MODE_PASS_BITMAP_ITSELF //use setImageViewBitmap
, MODE_PASS_BITMAP_URI //use setImageViewUri
};
private static String PATH_TO_INTERNAL_FILES; //path to stored bitmaps
Ввел функцию save_all_bitmaps_from_resources_to_application_directory для сохранения битмапок из ресурсов в файлы:private void save_all_bitmaps_from_resources_to_application_directory(Context context) {
for (int i = 0; i < WidgetInstanceContent.WHEEL_ANIMATION.length; ++i) {
Bitmap bmp = WidgetInstanceContent.GetCachedBitmapById(i + 1);
try {
String filename = String.valueOf(i + 1) + ".png";
FileOutputStream out = context.openFileOutput(filename, Context.MODE_WORLD_READABLE);
bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
} catch (Exception e) {
e.printStackTrace();
}
}
}Эта функция вызывается в OnUpdate. Uri uri = Uri.fromFile(context.getFileStreamPath("FILENAME"));
PATH_TO_INTERNAL_FILES = uri.toString();
if (USE_GENERATED_BITMAPS == tmodes.MODE_PASS_BITMAP_URI) {
save_all_bitmaps_from_resources_to_application_directory(context);
}В функцию update_widget_view добавил обработку третьего режима эмуляции анимации:...
} else if (USE_GENERATED_BITMAPS == tmodes.MODE_PASS_BITMAP_URI) {
//pass URI of bitmap to remote view
int step = wic.FrameId;
String s = PATH_TO_INTERNAL_FILES;
s = s.replace("FILENAME", String.valueOf(step + 1) + ".png");
try {
s = s.replace("file://", "");
Uri uri = Uri.parse(new File(s).toString());
remoteViews.setImageViewUri(R.id.bkview, uri);
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
} catch (Exception ex) {
Log.e(TAG_LOG, ex.toString());
}
}Несколько замечаний по коду. Переменная PATH_TO_INTERNAL_FILES используется для хранения пути к сохраняемым файлам (получить этот путь в update_widget_view не удается, т.к. там нет context). В качестве имени файла в ней указано "FILENAME" - в процессе работы вместо "FILENAME" подставляется реальное имя файла. Префикс "file://" приходится удалять, т.к. с ним setImageViewUri не работает, похоже из-за вот этого бага вылазит ошибка "resolveUri failed on bad bitmap uri...".
Спасибо. Почерпнул полезное и для себя.
ОтветитьУдалить