2

В настоящее время я разрабатываю виджет Android, содержащий изображение. Виджет должен быть изменен. Изображение должно заполнить всю ширину виджета (это легкая часть) и должно заполнить 30% высоты виджета при соблюдении максимальной высоты 80dip (это то, что я не могу понять).Масштаб изображения в Android-виджетах относительно высоты виджета, но соблюдайте максимальную высоту

В следующем макете, изображение масштабируется правильно по ширине, но не на высоте:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/widget" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="@dimen/widget_margin"> 

     <ImageView 
      android:id="@+id/promoShelf" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:src="@drawable/shelf" 
      android:scaleType="fitXY" 
      android:layout_alignParentBottom="true" 
      android:layout_centerHorizontal="true" /> 

</RelativeLayout> 

Я попытался использовать LinearLayout с весами, чтобы это было сделано, что можно увидеть в следующем сниппет. Однако, похоже, что android:maxHeight не соблюдается, когда используются веса.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/widget" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="@dimen/widget_margin"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="bottom" 
     android:orientation="vertical" 
     android:weight_sum="1"> 

     <ImageView 
      android:layout_width="match_parent" 
      android:layout_height="0dip" 
      android:maxHeight="80dip" 
      android:src="@drawable/my_image" 
      android:scaleType="fitXY" 
      android:layout_weight="0.3" /> 

    </LinearLayout> 
</RelativeLayout> 

Итак, это (нежелательный) результат:

enter image description here

Почему MaxHeight не работает или кто-нибудь есть идеи, как обойти это? Любая помощь очень ценится!

ответ

0

Эй я знаю его не действительно хорошее решение, но это только один я имею в моем сознании как сейчас: P

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/widget" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="bottom" 
    android:orientation="vertical" 
    android:weight_sum="1"> 
<View android:layout_width="fill_parent" 
android:layout_height="0dip" 
android:layout_weight="0.7" 
android:background="#000000"/> 
    <ImageView 
     android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:maxHeight="80dip" 
     android:src="@drawable/ic_action_search" 
     android:scaleType="fitXY" 
     android:background="#800000" 
     android:layout_weight="0.3" /> 

    </LinearLayout> 
</RelativeLayout> 
+0

Привет Droidee. Спасибо, но, к сожалению, это имеет тот же результат, что и код в моих вопросах, т. Е. MaxHeight не соблюдается. – Flo

2

Я не уверен, если это будет работать, но попробуйте это:

Оберните ImageView в контейнер. Пусть контейнер составляет 30% от высоты LinearLayout. ImageView прикрепляется к bottom контейнера и ImageView будет иметь максимальную высоту-80dp:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/widget" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="@dimen/widget_margin"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="bottom" 
     android:orientation="vertical" > 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="0.7" /> 

     <FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="0.3" > 
      <ImageView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_gravity="bottom" 
       android:maxHeight="80dip" 
       android:src="@drawable/my_image" 
       android:scaleType="fitXY" 
       /> 
     </FrameLayout> 

    </LinearLayout> 
</RelativeLayout> 
+0

Спасибо за ваш ответ. К сожалению, maxHeight по-прежнему не соблюдается в вашем подходе. Я не совсем понимаю, почему, хотя ... – Flo

+0

Хорошо, немного поиграв, я узнал, что он действительно работает. Единственное, что мне пришлось изменить, это установить 'android: layout_height' из ImageView на' wrap_content' вместо 'match_parent'. Кроме того, есть еще одна вещь, которая должна быть изменена в вашем коде, если она будет использоваться для виджета приложения. Поскольку «Просмотр» не поддерживается типом виджетов для RemoteViews, «View» следует изменить на «ImageView» , Спасибо за помощь! – Flo

+0

Я только выяснил, в чем причина необходимости 'wrap_content':' maxHeight' до сих пор не имеет никакого эффекта. Используя 'wrap_content', ImageView не масштабируется выше исходной высоты изображения, но все равно сжимается, если высота родителя уменьшается. Таким образом, чтобы получить вышеуказанный код, работающий как ожидалось, нужно убедиться, что используемое изображение имеет высоту 160 пикселей (т. Е. MaxHeight). Я все еще хотел бы знать, почему maxHeight, похоже, не работает, когда используются веса ... – Flo

3

Я не уверен, что это хорошее решение, которое использует только Standart компоненты. Но это легко сделать с помощью пользовательского ImageView виджета.

public class MyImageView extends ImageView { 
    private float weight = 0.3f; 
    private int maxHeight; 

    public MyImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     if (attrs != null) { 
      final int[] ids = {android.R.attr.maxHeight}; 
      final TypedArray array = context.obtainStyledAttributes(attrs, ids); 

      if (array != null) { 
       maxHeight = array.getDimensionPixelSize(0, 0); 
       array.recycle(); 
      } 
     } 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     if (maxHeight > 0) { 
      final int height = MeasureSpec.getSize(heightMeasureSpec); 
      final int result = Math.min(Math.round(height * weight), maxHeight); 

      heightMeasureSpec = MeasureSpec.makeMeasureSpec(result, MeasureSpec.EXACTLY); 
     } 

     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 
} 

А потом в макете:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#0f0"> 

    <com.example.MyImageView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentBottom="true" 
     android:background="#f00" 
     android:maxHeight="80dip"/> 

</RelativeLayout> 
+1

Привет, vmironov. Спасибо за ответ. Насколько я знаю, пользовательские виджеты или подклассы не поддерживаются в виджетах приложений Android, к сожалению ... http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout – Flo