2015-02-11 118 views
4

我在代碼創建ImageView的Android ImageView的縮放confict

ImageView vlogo = new ImageView(v.getContext()); 
     RelativeLayout.LayoutParams vlogoParams = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 
     vlogoParams.addRule(RelativeLayout.ALIGN_TOP,tv_visitor.getId()); 
     vlogoParams.addRule(RelativeLayout.ALIGN_LEFT, tv_visitor.getId()); 
     vlogoParams.addRule(RelativeLayout.ALIGN_BOTTOM, tv_visitor.getId()); 
     vlogo.setLayoutParams(vlogoParams); 
     vlogo.setImageResource(R.drawable.star); 
     rl.addView(vlogo); 

的圖像通過它對準TOP和先前創建tv_visitor鑑於BOTTOM(即已經被添加到相對佈局)「縮放」。但我認爲它尚未放棄(?)。 .requestLayout就在這個代碼不會改變一件事情之前。 Picture

通過這樣做,我將ImageView的高度設置爲tv_visitor視圖的高度。這是好的。但寬度似乎保持原來的。

問題來了。寬度不會縮放。 我這樣做的方式是讓.setAdjustViewBounds(true);無法正常工作。我應該如何繼續?

正如意見中的要求我提供更多的信息:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/news_scrollView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ff000000" 
    android:scrollbars="none"> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/fragment_news2"> 
    <View 
     android:id="@+id/anchor_n" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:background="#ffbb00" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" /> 
</RelativeLayout> 
</ScrollView> 

視圖被作爲參數傳遞和佈局是由得到:

RelativeLayout rl = (RelativeLayout) v.findViewById(R.id.fragment_news2); 
+0

什麼是您的'tv_visitor視圖'和它的'LayoutParams'是什麼,你確定原始圖像沒有任何填充? – blizzard 2015-02-11 21:21:51

+0

它也是用Java創建的。這是一個帶有MATCH_PARENT x WRAP_CONTENT的TextView。它放在0x0「錨點」視圖的右側。當然沒有填充和邊距。我甚至試圖在Java中設置它們(使用px2dp公式),但它不能解決它,因爲根據屏幕我得到了不同的結果。 – 2015-02-11 21:31:46

+0

這是由'RelativeLayout'中的一個錯誤引起的,因爲它查詢它的子對象的默認度量(僅受它自己的大小約束限制),然後強制它自己修改,而不查詢給定約束條件的首選維度兒童。作爲一種解決方法,您可以將其包裝在另一個容器中,該容器應至少允許正確對齊(儘管容器的寬度將保持不變)。對家長的身高進行硬編碼也可以解決這個問題。稍後再探討這個問題後我會添加一個答案。 – corsair992 2015-02-11 21:55:38

回答

2

的問題是由於Imageview縮放,因爲默認情況下,imageview使用的是ImageView.ScaleType.FIT_CENTER。按照文檔FIT_CENTER執行以下操作:

計算一個比例,將保持原來的SRC的縱橫比,但 還將確保完全的src適合內部DST。至少有一個軸 (X或Y)將完全適合。 結果集中在dst之內。

由於圖像被調整大小和居中,因此您會在左右兩側看到額外的空間。要避免將ScaleType設置爲ImageView.ScaleType.FIT_END,然後將結果與右對齊將解決問題。

vlogo.setScaleType(ImageView.ScaleType.FIT_END); 
+0

這對我很有用。謝謝。但是,它似乎仍有左邊的「隱形邊緣」。寬度保持不變,但img向右移動。它不關心我,並在多個屏幕上渲染效果很好。 – 2015-02-11 22:19:46

+1

@BartLizak是的,會有不可見的邊距,因爲只有圖像對齊右側,Imageview的寬度不會調整大小。爲了避免這種情況,您需要在將其分配給ImageView之前調整原始位圖('Bitmap.createScaledBitmap')的大小。 – blizzard 2015-02-11 22:38:19