2013-05-21 71 views
0

我的活動有1280x800像素的背景圖像。我使用android:scaleType="centerCrop"來設置它。安卓位置視圖裏面的佈局

有一個背景圖像上描繪的旗杆,我需要在旗杆上方放置另一個圖像(「旗幟」)。

如果設備的屏幕尺寸正好是1280x800,那麼「標誌」的位置將是(850,520)。但屏幕尺寸可能會有所不同,Android會縮放並將背景圖像相應地移至centerCrop標誌。因此,我需要以某種方式分配比例並轉移到「旗幟」圖像上,以便將其放置在旗杆上方。

我檢查了ImageView.java,發現scaleType用於設置private Matrix mDrawMatrix。但我沒有閱讀權限,因爲它是私密的。

因此,鑑於

@Override 
public void onGlobalLayout() 
{ 
    ImageView bg = ...; 
    ImageView flag = ...; 
    int bgImageWidth = 1280; 
    int bgImageHeight = 800; 
    int flagPosX = 850; 
    int flagPosY = 520; 
    // What should I do here to place flag nicely? 
} 

回答

0

你可以看到屏幕(context.getResources().getDisplayMetrics().widthPixelscontext.getResources().getDisplayMetrics().heightPixels)的大小和計算的是從圖像中可見,例如,你可以做這樣的事情(有沒有真正測試,但你應該明白我的意思):

private void placeFlag(Context context) { 
    ImageView bg = new ImageView(context); 
    ImageView flag = new ImageView(context); 
    int bgImageWidth = 1280; 
    int bgImageHeight = 800; 
    int flagPosX = 850; 
    int flagPosY = 520; 

    int screenWidth = context.getResources().getDisplayMetrics().widthPixels; 
    int screenHeight = context.getResources().getDisplayMetrics().heightPixels; 

    //calculate the proportions between the width of the bg and the screen 
    double widthScale = (double) bgImageWidth/(double) screenWidth; 
    double heightScale = (double) bgImageHeight/(double) screenHeight; 

    //see the real scale used, it will be the maximum between the 2 values because you are using crop 
    double realScale = Math.max(widthScale, heightScale); 
    //calculate the position for the flag 
    int flagRealX = (int) (flagPosX * realScale); 
    int flagRealY = (int) (flagPosY * realScale); 
} 

此外,你應該做的是,在方法onGlobalLayout,你可以,如果你想自定義視圖爲此在onCreate()或在構造函數中。

0

你可以在這裏使用一個LayerDrawable方法來製作一個可繪製的靜態圖像(你可以在custom_drawable.xml中設置背景圖像和背景圖像的頂部圖標,並且可以在活動中使用該文件作爲單個可繪製圖像)。有關參考請轉至android developer。否則 對於根據不同device resolution的標尺問題將圖像放在不同的可繪製文件夾中,也可以設計不同的佈局。