Commit cee53512 by 段启岩

自定义布局DynamicGridLayout完成

parent fd9ae6fb
...@@ -86,6 +86,11 @@ public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseVi ...@@ -86,6 +86,11 @@ public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseVi
Glide.with(binding.getRoot()).load(post.getUserAvatar()).apply(options).into(binding.imgUserAvatar); Glide.with(binding.getRoot()).load(post.getUserAvatar()).apply(options).into(binding.imgUserAvatar);
} }
if (null != post.getPictures() && post.getPictures().size() > 0) {
binding.dynamicGridLayout.setImages(post.getPictures());
} else {
binding.dynamicGridLayout.clear();
}
} }
static class TopicLinkClickable extends ClickableSpan { static class TopicLinkClickable extends ClickableSpan {
......
package cn.yunliyunwai.beyondclouds.view;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.RequiresApi;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import java.util.List;
import cn.yunliyunwai.beyondclouds.R;
/**
* 动态九宫格布局
*/
public class DynamicGridLayout extends ViewGroup {
private int mRow;
private int mCol;
private int mSpacing;
List<String> mImgUrls;
public DynamicGridLayout(Context context) {
super(context);
}
public DynamicGridLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initAttrs(context, attrs);
}
public DynamicGridLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initAttrs(context, attrs);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public DynamicGridLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initAttrs(context, attrs);
}
private void initAttrs(Context context, AttributeSet attrs) {
mSpacing = (int) (6 * context.getResources().getDisplayMetrics().density);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (!hasImages()) {
return;
}
// 计算布局尺寸
int maxWidth = MeasureSpec.getSize(getMeasuredWidth());
// 每个图片的尺寸
int imageSize = (maxWidth - (mCol - 1) * mSpacing) / mCol;
int layoutHeight = imageSize * mRow + (mRow - 1) * mSpacing;
LayoutParams layoutParams = getLayoutParams();
layoutParams.height = layoutHeight;
setLayoutParams(layoutParams);
int currentRow, currentCol;
for (int i = 0; i < mImgUrls.size(); i++) {
currentRow = i / mCol;
currentCol = i - (currentRow * mCol);
ImageView imageView = new ImageView(this.getContext());
RequestOptions options = new RequestOptions()
.centerCrop()
.placeholder(R.drawable.placeholder_square)
.error(R.drawable.placeholder_square)
.priority(Priority.HIGH)
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC);
Glide.with(this).load(mImgUrls.get(i)).apply(options).into(imageView);
this.addView(imageView, new LayoutParams(imageSize, imageSize));
int left = computePosition(currentCol, imageSize);
int top = computePosition(currentRow, imageSize);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.layout(left, top, left + imageSize, top + imageSize);
}
}
private int computePosition(int directionIndex, int imageSize) {
return (imageSize + mSpacing) * directionIndex;
}
public void setImages(List<String> imgUrls) {
removeAllViewsInLayout();
this.mImgUrls = imgUrls;
LayoutParams layoutParams = getLayoutParams();
if (!hasImages()) {
layoutParams.height = 0;
setLayoutParams(layoutParams);
return;
}
initGridParams();
requestLayout();
}
/**
* 求出行数和列数
*/
private void initGridParams() {
if (!hasImages()) {
return;
}
int size = mImgUrls.size();
if (size <= 3) {
mRow = 1;
mCol = size;
} else if (size <= 6) {
mRow = 2;
mCol = 3;
} else {
mRow = 3;
mCol = 3;
}
}
public void clear() {
setImages(null);
}
public boolean hasImages() {
return null != mImgUrls && mImgUrls.size() > 0;
}
public int getImageCount() {
return mImgUrls.size();
}
}
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
android:layout_marginLeft="60dp" android:layout_marginLeft="60dp"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
android:textColor="@color/colorTextAccent" android:textColor="@color/colorTextAccent"
android:textSize="14sp" android:textSize="15sp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="22dp" /> android:layout_height="22dp" />
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
android:text="SpringBoot迭代发布JRA瘦身配置" android:text="SpringBoot迭代发布JRA瘦身配置"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="14sp" android:textSize="15sp"
android:textColorHint="@color/colorPrimaryTouched" android:textColorHint="@color/colorPrimaryTouched"
android:linksClickable="true" android:linksClickable="true"
android:textColorHighlight="@color/colorBackgroundTopicTouched" android:textColorHighlight="@color/colorBackgroundTopicTouched"
...@@ -71,6 +71,7 @@ ...@@ -71,6 +71,7 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
/> />
<androidx.constraintlayout.widget.Barrier <androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier_content" android:id="@+id/barrier_content"
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -80,9 +81,23 @@ ...@@ -80,9 +81,23 @@
tools:layout_editor_absoluteX="12dp" tools:layout_editor_absoluteX="12dp"
tools:layout_editor_absoluteY="16dp" /> tools:layout_editor_absoluteY="16dp" />
<cn.yunliyunwai.beyondclouds.view.DynamicGridLayout
android:id="@+id/dynamic_grid_layout"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/barrier_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier_dynamic_grid"
app:constraint_referenced_ids="dynamic_grid_layout"
app:barrierDirection="bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<View <View
android:layout_marginTop="18dp" android:layout_marginTop="18dp"
app:layout_constraintTop_toBottomOf="@id/barrier_content" app:layout_constraintTop_toBottomOf="@id/barrier_dynamic_grid"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
android:layout_width="0dp" android:layout_width="0dp"
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view" android:id="@+id/recycler_view"
app:fastScrollEnabled="false"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scrollbars="vertical" /> android:scrollbars="vertical" />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment