Получение размера изображения для создания растрового изображения

Я – программист с фоном Windows, и я новичок в Java и Android,

Я хочу создать виджет (а не приложение), который отображает диаграмму.

После долгого исследования я знаю, что могу это сделать с Canvas, изображениями и растровыми изображениями.

Холст, который я рисую, должен быть таким же, как размер виджета.

Поэтому вопрос: как узнать размер виджета (или размер изображения), чтобы я мог предоставить его функции

Bitmap.createBitmap (width_xx, height_yy, Config.ARGB_8888);

Фрагмент кода: в методе запуска таймера:

@Override public void run() { Bitmap bitmap = Bitmap.createBitmap(??, ??, Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); //create new paint Paint p = new Paint(); p.setAntiAlias(true); p.setStrokeWidth(1); //draw circle //here i can use the width and height to scale the circle canvas.drawCircle(50, 50, 7, p); remoteViews.setImageViewBitmap(R.id.imageView, bitmap); 

Solutions Collecting From Web of "Получение размера изображения для создания растрового изображения"

Из того, что я узнал, вы можете рассчитать размеры виджета только на Android 4.1+. Когда вы используете более низкий API, вам придется использовать статические измерения. О размерах виджетов: рекомендации по дизайну приложений для виджета

 int w = DEFAULT_WIDTH, h = DEFAULT_HEIGHT; if ( Build.VERSION.SDK_INT >= 16 ) { Bundle options = appWidgetManager.getAppWidgetOptions(widgetId); int maxW = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH); int maxH = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT); int minW = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); int minH = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); if ( context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ) { w = maxW; h = minH; } else { w = minW; h = maxH; } } 

Посмотрите на метод:

 public void onAppWidgetOptionsChanged (Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) 

Он будет вызываться каждый раз при запуске / изменении размера виджета.

Получение ширины / высоты виджета можно сделать следующим образом:

 newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH) newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH) newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT) newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT) 

Дайте мне знать, если это ответит на ваш вопрос.

В настоящее время я использую это, надеюсь, что это поможет

 private void run() { int width = 400, height = 400; Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bitmap); Paint p = new Paint(); p.setColor(Color.WHITE); p.setStyle(Paint.Style.STROKE); p.setStrokeWidth(1); p.setAntiAlias(true); c.drawCircle(width/2, height/2, radius, p); remoteViews.setImageViewBitmap(R.id.imageView, bitmap); ComponentName clockWidget = new ComponentName(context, Clock_22_analog.class); AppWidgetManager appWidgetManager = AppWidgetManager .getInstance(context); appWidgetManager.updateAppWidget(clockWidget, remoteViews); } 

Вы можете использовать это

 Bitmap image1, image2; Bitmap bitmap = Bitmap.createBitmap(image1.getWidth(), image1.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bitmap); 

надеюсь, это поможет. 🙂

U может создавать пользовательский виджет .. и устанавливать размер wight на свой метод onMeasure () .. и также сохранять размер в это время, чтобы вы могли использовать дальше для создания изображений .. Hop

Я не работал над Widgets, но у меня есть некоторый опыт получения размера ImageView.

Вот какой код я использую:

 public class ViewSizes { public int width; public int height; public boolean isEmpty() { boolean result = false; if (0 >= width || 0 >= height) { result = true; } return result; } } 

Это просто фиктивный класс, содержащий параметры размера.

 public static ViewSizes getSizes(View view) { ViewSizes sizes = new ViewSizes(); sizes.width = view.getWidth(); sizes.height = view.getHeight(); if (sizes.isEmpty()) { LayoutParams params = view.getLayoutParams(); if (null != params) { int widthSpec = View.MeasureSpec.makeMeasureSpec(params.width, View.MeasureSpec.AT_MOST); int heightSpec = View.MeasureSpec.makeMeasureSpec(params.height, View.MeasureSpec.AT_MOST); view.measure(widthSpec, heightSpec); } sizes.width = view.getMeasuredWidth(); sizes.height = view.getMeasuredHeight(); } return sizes; } 

Этот метод вычисляет ширину, заставляющую цикл измерения, если такого еще не произошло.

 public static boolean loadPhoto(ImageView view, String url, float aspectRatio) { boolean processed = false; ViewSizes sizes = ViewsUtils.getSizes(view); if (!sizes.isEmpty()) { int width = sizes.width - 2; int height = sizes.height - 2; if (ASPECT_RATIO_UNDEFINED != aspectRatio) { if (height * aspectRatio > width) { height = (int) (width / aspectRatio); } else if (height * aspectRatio < width) { width = (int) (height * aspectRatio); } } // Do you bitmap processing here processed = true; } return processed; } 

Этот, вероятно, бесполезен для вас. Я приведу только как пример – у меня есть ImageView и url изображения, который должен быть параметризован с изображением и высотой.

 public class PhotoLayoutListener implements OnGlobalLayoutListener { private ImageView view; private String url; private float aspectRatio; public PhotoLayoutListener(ImageView view, String url, float aspectRatio) { this.view = view; this.url = url; this.aspectRatio = aspectRatio; } boolean handled = false; @Override public void onGlobalLayout() { if (!handled) { PhotoUtils.loadPhoto(view, url, aspectRatio); handled = true; } ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); if (viewTreeObserver.isAlive()) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { removeLayoutListenerPre16(viewTreeObserver, this); } else { removeLayoutListenerPost16(viewTreeObserver, this); } } } @SuppressWarnings("deprecation") private void removeLayoutListenerPre16(ViewTreeObserver observer, OnGlobalLayoutListener listener){ observer.removeGlobalOnLayoutListener(listener); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void removeLayoutListenerPost16(ViewTreeObserver observer, OnGlobalLayoutListener listener){ observer.removeOnGlobalLayoutListener(listener); } } 

Это всего лишь слушатель макета – я хочу обработать загрузку изображения после завершения этапа компоновки.

 public static void setImage(ImageView view, String url, boolean forceLayoutLoading, float aspectRatio) { if (null != view && null != url) { final ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); if (forceLayoutLoading || !PhotoUtils.loadPhoto(view, url, aspectRatio)) { if (viewTreeObserver.isAlive()) { viewTreeObserver.addOnGlobalLayoutListener(new PhotoLayoutListener(view, url, aspectRatio)); } } } } 

Это метод, который я фактически называю. Я даю ему представление и URL. Методы заботятся о загрузке – если он может определить размер представления, он сразу начинает загружаться. В противном случае он просто назначает слушателя макета и запускает процесс загрузки после завершения компоновки.

Вы можете отменить некоторые параметры – forceLoading / aspectRatio не имеет значения для вас. После этого измените метод PhotoUtils.loadPhoto , чтобы создать растровое изображение с рассчитанной шириной / высотой.

Вот учебники, которые вы должны пойти, все четко указано для: Разработка виджетов на главном экране Android

Как сказал Джулиан, вы можете получить их так, как растровое изображение

 int width = bitmap.getWidth(); int height = bitmap.getHeight();