Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fixed aspect ratio View

How would I go implementing a fixed aspect ratio View? I'd like to have items with 1:1 aspect ratio in a GridView. I think it's better to subclass the children than the GridView?

EDIT: I assume this needs to be done programmatically, that's no problem. Also, I don't want to limit the size, only the aspect ratio.

like image 655
Jani Avatar asked Aug 14 '11 17:08

Jani


People also ask

What is aspect ratio in Android Studio?

16:9 standard aspect ratio.

How do you find the aspect ratio?

To determine the aspect ratio of a screen: Measure the width and height of the screen. Divide the width by the height. Compare the result with the popular aspect ratios, e.g., 16:9 , to determine which standard your screen follows.

What is CSS aspect ratio?

The CSS property aspect-ratio lets you create boxes that maintain proportional dimensions where the height and width of a box are calculated automatically as a ratio.


1 Answers

I implemented FixedAspectRatioFrameLayout, so I can reuse it and have any hosted view be with fixed aspect ratio:

public class FixedAspectRatioFrameLayout extends FrameLayout {     private int mAspectRatioWidth;     private int mAspectRatioHeight;      public FixedAspectRatioFrameLayout(Context context)     {         super(context);     }      public FixedAspectRatioFrameLayout(Context context, AttributeSet attrs)     {         super(context, attrs);          init(context, attrs);     }      public FixedAspectRatioFrameLayout(Context context, AttributeSet attrs, int defStyle)     {         super(context, attrs, defStyle);          init(context, attrs);     }      private void init(Context context, AttributeSet attrs)     {         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FixedAspectRatioFrameLayout);          mAspectRatioWidth = a.getInt(R.styleable.FixedAspectRatioFrameLayout_aspectRatioWidth, 4);         mAspectRatioHeight = a.getInt(R.styleable.FixedAspectRatioFrameLayout_aspectRatioHeight, 3);          a.recycle();     }     // **overrides**      @Override protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)     {         int originalWidth = MeasureSpec.getSize(widthMeasureSpec);          int originalHeight = MeasureSpec.getSize(heightMeasureSpec);          int calculatedHeight = originalWidth * mAspectRatioHeight / mAspectRatioWidth;          int finalWidth, finalHeight;          if (calculatedHeight > originalHeight)         {             finalWidth = originalHeight * mAspectRatioWidth / mAspectRatioHeight;              finalHeight = originalHeight;         }         else         {             finalWidth = originalWidth;             finalHeight = calculatedHeight;         }          super.onMeasure(                 MeasureSpec.makeMeasureSpec(finalWidth, MeasureSpec.EXACTLY),                  MeasureSpec.makeMeasureSpec(finalHeight, MeasureSpec.EXACTLY));     } } 
like image 189
TalL Avatar answered Nov 10 '22 18:11

TalL