2012-02-26 58 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方法,以創建已計算寬度/高度的位圖。