簡體   English   中英

自定義呈現Android應用小部件

[英]Custom rendered Android app widget

我正在為Android創建一個應用程序小部件,由於它是由圖形等自定義元素組成的,因此必須呈現為位圖。

但是,我在這個過程中遇到了一些障礙。

1) 有沒有辦法找到app小部件的最大可用空間? (或者:是否可以針對WVGA(或類似的寬)情況下的最小可用空間正確計算尺寸?

我不知道如何計算app小部件的最大可用空間。 使用傳統的app小部件,可以使用fill_parent,並且將使用所有空間。 但是,將窗口小部件渲染為位圖並避免拉伸時,必須計算正確的尺寸。 文檔概述了如何計算最小尺寸,但對於諸如WVGA之類的情況,橫向模式中將存在未使用的空間 - 導致窗口小部件看起來比其他自然伸展的窗口小部件更短。

float density = getResources().getDisplayMetrics().density;
int cx = ((int)Math.ceil(appWidgetInfo.minWidth / density) + 2) / 74;
int cy = ((int)Math.ceil(appWidgetInfo.minHeight / density) + 2) / 74;
int portraitWidth = (int)Math.round((80.0f * cx - 2.0f) * density);
int portraitHeight = (int)Math.round((100.0f * cy - 2.0f) * density);
int landscapeWidth = (int)Math.round((106.0f * cx - 2.0f) * density);
int landscapeHeight = (int)Math.round((74.0f * cy - 2.0f) * density);

計算cx和cy給出水平和垂直單元格的數量。 從計算的dpi中減去-2(例如74 * cy - 2)是為了避免產生的像素數向下舍入的情況。 (例如,在Nexus One的橫向模式下,高度為110,而不是111(74 * 1.5)。

2)將位圖分配給ImageView(用作RemoteViews的一部分)以查看圖像時,有兩種方法:

2.1)通過使用setImageViewUri,並將位圖保存為PNG文件。 然后使用ContentProvider中的openFile()實現提供映像:

@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException
    // Code to set up imageFileName
    File file = new File(getContext().getCacheDir(), imageFileName);
    return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
}

這是有效的,這是我目前正在使用的方法。 但是,如果我將ImageView的scaleType設置為“center”,文檔應該“在視圖中居中,但不執行縮放。”,圖像會被錯誤地縮放。 將位圖的密度設置為DENSITY_NONE或getResources()。getDisplayMetrics()。densityDpi在將位圖保存到PNG時沒有任何區別,當ImageView加載文件時,它似乎被忽略。 結果是由於某些dpi問題,圖像縮小了。 這似乎描述了這種情況:

http://code.google.com/p/android/issues/detail?id=6957&can=1&q=widget%20size&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

因為無法使用scaleType:center,所以我發現工作的唯一方法是將ImageView的layout_width和layout_height靜態設置為給定的dpis數,然后將位圖渲染為相同的dpi。 這需要使用scaleType:fitXY。 這種方法有效,但它是一個非常靜態的設置 - 它不適用於可調整大小的3.1 app小部件(我還沒有測試過,但除非在每次調整大小時都調用onUpdate(),否則這是真的)。

有沒有辦法將圖像加載到未縮放的ImageView,或者由於框架中的錯誤,這是不可能的?

2.1)直接使用setImageViewBitmap。 使用此方法與位圖上的Bitmap.DENSITY_NONE設置,可以顯示圖像而無需正確縮放。 這種方法的問題在於如何通過IPC機制設置大圖像是有限的:

http://groups.google.com/group/android-developers/browse_thread/thread/e8d84920b999291f/d12eb1d0eaca93ac#01d5c89e5e7b4060

(不允許更多鏈接)http://groups.google.com/group/android-developers/browse_thread/thread/b11550601e6b1dd3#4bef4fa8908f7e6a

我試圖通過將小部件分成可以在100x100像素塊中設置的圖像矩陣來試圖解決這個問題。 這確實允許更大的小部件工作,但最終變得非常沉重並且在大型小部件上失敗(4x4)。

很抱歉很長的帖子。 我試圖在嘗試使用位圖渲染應用小部件時解釋一些不同的問題。 如果有人嘗試過相同的問題並找到了解決這些問題的更多解決方案,或者有任何有用的評論,我們將非常感激。

對我們來說類似情況的一種方法是將我們的圖形生成為9補丁png,實際的圖形部分作為可伸縮的中心矩形,以及標題文本和指示圖標(我們不希望所有圖形都延伸出來)形狀)和邊框效果,放在圖像的外部矩形上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM