2012-02-26 61 views
18

获得ImageView的大小我是一个窗口背景程序设计师,我是新来的Java和Android的东西,为位图创建

我想创建一个窗口小部件(而不是应用程序),它显示的图表。

经过长时间的研究,我知道我可以用Canvas,Imageviews和Bitmap来做到这一点。

我画的画布应该与Widget Size相同。

所以问题是: 我怎么知道小部件的大小(或大小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)。两个词共同需要回答这个问题,这个问题根本与你得到的答案没有任何关系。 – 2012-02-27 06:59:52

+4

我目前有同样的问题。如果你已经找到了解决问题的办法,如果你在这里发布它会很好。 – flocki 2012-08-31 12:34:53

回答

-1

这里是一个教程,你应该去,一切都清楚地给出了:Developing Android Home Screen Widgets

+1

感谢您的教程,它提供了很好的信息,但不幸的是我没有回答我的问题,我希望我的图表始终填充小部件大小,不管它具有哪种大小或具有哪个方向 – Augustus 2012-02-27 16:05:45

-2

像朱利安说,你可以让他们像用你的图片位图

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

请看他的示例代码。他想*创建位图,并创建将使用它的画布。我建议他等到.onDraw()提供Canvas。 – 2012-02-27 06:45:01

+0

是的,Julian是对的,位图需要基于Widget/imageview的大小来创建,我期望像这样:int width = widget.getWidth();或者int width = imageview.getWidth(); – Augustus 2012-02-27 16:03:17

2

从我所了解到的,你只能在Android 4.1+上计算widget的尺寸。 在较低的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 2016-01-19 23:50:15

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也节约了当时的大小,这样就可以进一步使用图像创建.. 合

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

这是我实际调用的方法。我给它的观点和网址。这些方法负责加载 - 如果它可以确定立即开始加载视图的大小。否则它只是分配一个布局监听器,并在布局完成后开始加载过程。

你可以去掉一些参数 - forceLoading/aspectRatio对你来说应该是不相关的。之后,更改PhotoUtils.loadPhoto方法,以创建已计算宽度/高度的位图。