RatioLayout — раскладка по пропорциям, адаптивная для экрана.
Поскольку часто используется Relative, был переопределен RelativeLayout.
Затем, из-за эффекта Material Design с водой, был добавлен FrameLayout.
Способ использования:
<cn.modificactor.ratiolayout.RatioRelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#00ff00"
app:ratioHeight="10"
app:ratioWidth="20"
app:reference="width|height" />
Во-первых, вам нужно самостоятельно определить конкретные размеры высоты или ширины (работа продолжается).
Затем заполните app:reference
тем, что было определено ранее как высота или ширина.
app:ratioHeight
, app:ratioWidth
— это пропорции высоты и ширины соответственно, вы можете также указывать размеры для iOS.
Нужно больше? Используйте конструктор для этого:
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatioRelativeLayout, defStyleAttr, 0);
// Получаем сторону для сравнения
reference = typedArray.getInt(R.styleable.RatioRelativeLayout_reference, 0) == 0 ? ReferenceType.WIDTH : ReferenceType.HEIGHT;
// Получаем пропорцию высоты
ratioHeight = typedArray.getFloat(R.styleable.RatioRelativeLayout_ratioHeight, 1);
// Получаем пропорцию ширины
ratioWidth = typedArray.getFloat(R.styleable.RatioRelativeLayout_ratioWidth, 1);
typedArray.recycle();
Затем заполните следующие поля:
/**
* Сторона для сравнения, по умолчанию ширина
*/
ReferenceType reference = ReferenceType.WIDTH;
/**
* Пропорция ширины
*/
double ratioWidth = 1;
/**
* Пропорция высоты
*/
double ratioHeight = 1;
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
/**
* Если ширина является основной стороной, то она остаётся неизменной, а высота рассчитывается по пропорции,
* если же высота является основной стороной, то она остаётся неизменной, а ширина рассчитывается по пропорции
*/
setMeasuredDimension(View.getDefaultSize(0, reference == ReferenceType.WIDTH ? widthMeasureSpec :
(int) (heightMeasureSpec / ratioHeight * ratioWidth)),
View.getDefaultSize(0, reference == ReferenceType.HEIGHT ? heightMeasureSpec :
(int) (widthMeasureSpec / ratioWidth * ratioHeight)));
int childSpec = reference == ReferenceType.WIDTH ? getMeasuredWidth() : getMeasuredHeight();
/**
* Получаем размер второй стороны
*/
int measureSpec = reference == ReferenceType.HEIGHT ? MeasureSpec.makeMeasureSpec(
(int) (childSpec / ratioHeight * ratioWidth), MeasureSpec.EXACTLY) :
MeasureSpec.makeMeasureSpec(
(int) (childSpec / ratioWidth * ratioHeight), MeasureSpec.EXACTLY);
super.onMeasure(reference == ReferenceType.WIDTH ? widthMeasureSpec : measureSpec, reference == ReferenceType.HEIGHT ? heightMeasureSpec : measureSpec);
}
Это всё, работает для View & ViewGroup.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )