Compose things

This commit is contained in:
Grishka
2022-03-15 21:40:52 +03:00
parent b2588fbb6e
commit 8c5d6cd4a6
11 changed files with 532 additions and 33 deletions

View File

@@ -0,0 +1,97 @@
package org.joinmastodon.android.ui.views;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import me.grishka.appkit.utils.V;
public class ComposeMediaLayout extends ViewGroup{
private static final int MAX_WIDTH_DP=400;
private static final int GAP_DP=8;
private static final float ASPECT_RATIO=0.5625f;
public ComposeMediaLayout(Context context){
this(context, null);
}
public ComposeMediaLayout(Context context, AttributeSet attrs){
this(context, attrs, 0);
}
public ComposeMediaLayout(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int mode=MeasureSpec.getMode(widthMeasureSpec);
@SuppressLint("SwitchIntDef")
int width=switch(mode){
case MeasureSpec.AT_MOST -> Math.min(V.dp(MAX_WIDTH_DP), MeasureSpec.getSize(widthMeasureSpec));
case MeasureSpec.EXACTLY -> MeasureSpec.getSize(widthMeasureSpec);
default -> throw new IllegalArgumentException("unsupported measure mode");
};
int height=Math.round(width*ASPECT_RATIO);
setMeasuredDimension(width, height);
// We don't really need this, but some layouts will freak out if you don't measure them
int childWidth, firstChildHeight, otherChildrenHeight=0;
int gap=V.dp(GAP_DP);
switch(getChildCount()){
case 0 -> {
return;
}
case 1 -> {
childWidth=width;
firstChildHeight=height;
}
case 2 -> {
childWidth=(width-gap)/2;
firstChildHeight=otherChildrenHeight=height;
}
case 3 -> {
childWidth=(width-gap)/2;
firstChildHeight=height;
otherChildrenHeight=(height-gap)/2;
}
default -> {
childWidth=(width-gap)/2;
firstChildHeight=otherChildrenHeight=(height-gap)/2;
}
}
for(int i=0;i<getChildCount();i++){
getChildAt(i).measure(childWidth | MeasureSpec.EXACTLY, (i==0 ? firstChildHeight : otherChildrenHeight) | MeasureSpec.EXACTLY);
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b){
int gap=V.dp(GAP_DP);
int width=r-l;
int height=b-t;
int halfWidth=(width-gap)/2;
int halfHeight=(height-gap)/2;
switch(getChildCount()){
case 0 -> {}
case 1 -> getChildAt(0).layout(0, 0, width, height);
case 2 -> {
getChildAt(0).layout(0, 0, halfWidth, height);
getChildAt(1).layout(halfWidth+gap, 0, width, height);
}
case 3 -> {
getChildAt(0).layout(0, 0, halfWidth, height);
getChildAt(1).layout(halfWidth+gap, 0, width, halfHeight);
getChildAt(2).layout(halfWidth+gap, halfHeight+gap, width, height);
}
default -> {
getChildAt(0).layout(0, 0, halfWidth, halfHeight);
getChildAt(1).layout(halfWidth+gap, 0, width, halfHeight);
getChildAt(2).layout(0, halfHeight+gap, halfWidth, height);
getChildAt(3).layout(halfWidth+gap, halfHeight+gap, width, height);
}
}
}
}