2013-08-06 6 views
1

У меня есть виджет в моем приложении, у которого есть ImageView для отображения холста.Android Widget Canvas - java.lang.IllegalArgumentException

Если я смотрю в мой Пользователь вылетает я вижу эту ошибку очень часто (но всегда только на нескольких устройствах):

java.lang.RuntimeException: Unable to start receiver my.package.name.WidgetProvider: java.lang.IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage (used: 5715000, max: 5529600 /*these arent always the same :)*/) The total memory cannot exceed that required to fill the device's screen once. 

мой холст имеет динамический размер, он автоматически изменяет размер, когда пользователь изменяет размер и имеет заданное соотношение сторон, то создается так:

Resources r = context.getResources(); 
    SharedPreferences widgets = context.getSharedPreferences("widgets", 0); 

      //these are stored in onAppWidgetOptionsChanged when user resizes his widget 
    int w = widgets.getInt(widgetId + "_width", 130); 
    int h = widgets.getInt(widgetId + "_height", 160); 

    w = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, w, 
      r.getDisplayMetrics()); 
    h = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, h, 
      r.getDisplayMetrics()); 

    float scaleX = (float) w/(float) 13; 
    float scaleY = (float) h/(float) 16; 

    float scale = 1.5f * (scaleX < scaleY ? scaleX : scaleY);//i multiplied it with 1.5 because the canvas was very unsharp 

    w = (int) (13 * scale); 
    h = (int) (16 * scale); 

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
      R.layout.widget); 


    Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444); 
    Canvas canvas = new Canvas(bmp); 


[...] 

    remoteViews.setImageViewBitmap(R.id.widget, bmp); 

    appWidgetManager.updateAppWidget(widgetId, remoteViews); 

я думаю, это потому, что холст 1.5x больше виджета, но еще очень нечеткие.

Что я могу сделать?

Заранее спасибо.

Метин Капуста

ответ

1

documentation указывает, что:

Общая память Растровые, используемый объектом RemoteViews не может превышать , что требуется, чтобы заполнить экран в 1,5 раза, то есть. (ширина экрана x экран высота x 4 x 1,5) байт.

Итак, используйте это для управления размером растрового изображения, а затем используйте ImageView scaleType fitCenter в своем макете, чтобы масштабировать растровое изображение в виджетах.