2012-02-26 1 views
18

Я программирую с фоном окна и я новичок в Java и андроид вещь,Получение размера ImageView для создания Bitmap

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

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

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

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

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); 
+0

\ * facepalm \ *, [* App Widget *] (http://developer.android.com/guide/topics/appwidgets/index.html). Два слова, которые вместе требуют ответа на этот вопрос, который не имеет ничего общего с ответом, который вы получите до одного. –

+4

В настоящее время у меня такая же проблема. Если вы нашли решение проблемы, было бы здорово, если бы вы разместили ее здесь. – flocki

ответ

-1

Вот учебники, вы должны идти, все дается ясно для: Developing Android Home Screen Widgets

+1

спасибо за учебник, он предоставляет приятную информацию, но, к сожалению, не отвечает на мой вопрос, я хочу, чтобы мой график всегда заполнял размер виджета, независимо от того, какой размер он имеет или какая у него ориентация – Augustus

-2

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

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

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

+0

Да, Джулиан прав, растровое изображение необходимо создать на основе размера виджета/изображения, я ожидаю чего-то вроде: int width = widget.getWidth(); или int width = imageview.getWidth(); – Augustus

2

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

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; 
    } 
} 
+0

Работает отлично. Престижность за то, что она указала на необходимость взглянуть на ориентацию. Но почему ориентация имеет значение, когда значения называются «MIN» и «MAX»? – GaryAmundson

0

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

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); 
} 
0

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

Bitmap image1, image2; 

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

надежду, что помогает. :)

0

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

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) 

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

0

Я не работал над виджетами, но у меня есть некоторый опыт получения размера 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, чтобы создать растровое изображение с рассчитанной шириной/высотой.

 Смежные вопросы

  • Нет связанных вопросов^_^