Получение размера изображения для создания растрового изображения
Я программист с фоном окон, и я новичок в Java и андроидах,
Я хочу создать виджет (а не приложение), который отображает диаграмму.
после долгого исследования я знаю, что могу сделать это с помощью 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);
Ответы
Ответ 1
Из того, что я узнал, вы можете вычислять размеры виджета только на 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;
}
}
Ответ 2
Посмотрите на метод:
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)
Сообщите мне, если это ответит на ваш вопрос.
Ответ 3
В настоящее время я использую это, надеюсь, что это поможет
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);
}
Ответ 4
вы можете использовать этот
Bitmap image1, image2;
Bitmap bitmap = Bitmap.createBitmap(image1.getWidth(), image1.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bitmap);
надеюсь, что это поможет.:)
Ответ 5
u может создавать пользовательский виджет.. и устанавливать размер wight на свой метод onMeasure().. и также сохранять размер в это время, чтобы вы могли использовать его далее для создания образа.
Хоп
Ответ 6
Я не работал над 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
, чтобы создать растровое изображение с рассчитанной шириной/высотой.
Ответ 7
Вот учебники, которые вы должны пойти, все четко указано для: Разработка виджетов на главном экране Android
Ответ 8
как сказал Джулиан, вы можете получить их так, как растровое изображение.
int width = bitmap.getWidth();
int height = bitmap.getHeight();