短视频平台源码,动态上传的图片以九宫格形式展示
短视频平台源码,动态上传的图片以九宫格形式展示实现的相关代码
1 | public abstract class NineGridAdapter {<br> protected Context context;<br> protected List list;<br> public NineGridAdapter(Context context, List list) {<br> this .context = context;<br> this .list = list;<br> }<br> public abstract int getCount();<br> public abstract String getUrl( int positopn);<br> public abstract Object getItem( int position);<br> public abstract long getItemId( int position);<br> public abstract View getView( int i, View view);<br>} |
自定义View多图控件
1 | public class NineGridlayout extends ViewGroup {<br> private NineGridAdapter adapter;<br> private OnItemClickListerner onItemClickListerner;<br> // 行间距<br> private int lineSpace;<br> //列间距<br> private int gap;<br> private final int DEFAULT_WIDTH = 140;<br> private int columns;//<br> private int rows;//<br> private int totalWidth;<br> private Context context;<br> int singleWidth = 0, singleHeight = 0;<br> private int defaultWidth, defaultHeight;<br> private int oldCount;<br> public NineGridlayout(Context context) {<br> this(context, null);<br> }<br> public NineGridlayout(Context context, AttributeSet attrs) {<br> this(context, attrs, 0);<br> }<br> public NineGridlayout(Context context, AttributeSet attrs, int defStyleAttr) {<br> super(context, attrs, defStyleAttr);<br> this.context = context;<br> gap = dip2px(context, 10);<br> lineSpace = dip2px(context,10);<br> ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,<br> ViewGroup.LayoutParams.WRAP_CONTENT);<br> defaultWidth = defaultHeight = dip2px(context, DEFAULT_WIDTH);<br> }<br> public void setDefaultWidth(int defaultWidth) {<br> this.defaultWidth = defaultWidth;<br> }<br> public void setDefaultHeight(int defaultHeight) {<br> this.defaultHeight = defaultHeight;<br> }<br> public void setAdapter(NineGridAdapter adapter) {<br> this.adapter = adapter;<br> if (adapter == null) {<br> return;<br> }<br> //初始化布局形状<br> generateChildrenLayout(adapter.getCount());<br> //这里做一个重用view的处理<br>// if (oldCount == 0) {<br> removeAllViews();<br> for (int i = 0; i < adapter.getCount(); i++) {<br> View itemView = adapter.getView(i, null);<br> addView(itemView, generateDefaultLayoutParams());<br> }<br>// }<br> /*else {<br> //以前添加过view<br> int newViewCount = adapter.getCount();<br> if (oldCount > newViewCount) {<br> removeViews(newViewCount - 1, oldCount - newViewCount);<br> for (int i = 0; i < newViewCount - 1; i++) {<br> adapter.getView(i, getChildAt(i));<br> }<br> } else if (oldCount < newViewCount) {<br> for (int i = 0; i < newViewCount - oldCount; i++) {<br> View itemView = adapter.getView(i, null);<br> addView(itemView, generateDefaultLayoutParams());<br> }<br> }<br> }*/<br> oldCount = adapter.getCount();<br> requestLayout();<br> }<br> @Override<br> protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {<br> super.onMeasure(widthMeasureSpec, heightMeasureSpec);<br> int widthMode = MeasureSpec.getMode(widthMeasureSpec);<br> int heightMode = MeasureSpec.getMode(heightMeasureSpec);<br> int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);<br> int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);<br> totalWidth = sizeWidth - getPaddingLeft() - getPaddingRight();<br> if (adapter != null && adapter.getCount() > 0) {<br> int measureWidth, measureHeight;<br> int childrenCount = adapter.getCount();<br> if (childrenCount == 1) {<br> singleWidth = defaultWidth;<br> singleHeight = defaultHeight;<br> } else {<br> singleWidth = (totalWidth - gap * (3 - 1)) / 3;<br> singleHeight = singleWidth;<br> }<br> measureChildren(MeasureSpec.makeMeasureSpec(singleWidth, MeasureSpec.EXACTLY),<br> MeasureSpec.makeMeasureSpec(singleHeight, MeasureSpec.EXACTLY));<br> measureWidth = singleWidth * columns + gap * (columns - 1);<br> measureHeight = singleHeight * rows + lineSpace * (rows - 1);<br> setMeasuredDimension(sizeWidth, measureHeight);<br> }<br> }<br> @Override<br> protected void onLayout(boolean changed, int l, int t, int r, int b) {<br> layoutChildrenView();<br> }<br> private void layoutChildrenView() {<br> if (adapter == null || adapter.getCount() == 0) {<br> return;<br> }<br> int childrenCount = adapter.getCount();<br> for (int i = 0; i < childrenCount; i++) {<br> int[] position = findPosition(i);<br> int left = (singleWidth + gap) * position[1] + getPaddingLeft();<br> int top = (singleHeight + lineSpace) * position[0] + getPaddingTop();<br> int right = left + singleWidth;<br> int bottom = top + singleHeight;<br> ImageView childrenView = (ImageView) getChildAt(i);<br> if (childrenCount == 1) {<br> //只有一张图片<br> childrenView.setScaleType(ImageView.ScaleType.FIT_CENTER);<br> } else {<br> childrenView.setScaleType(ImageView.ScaleType.CENTER_CROP);<br> }<br> final int itemPosition = i;<br> childrenView.setOnClickListener(new OnClickListener() {<br> @Override<br> public void onClick(View v) {<br> if (onItemClickListerner != null) {<br> onItemClickListerner.onItemClick(v, itemPosition);<br> }<br> }<br> });<br> childrenView.layout(left, top, right, bottom);<br> }<br> }<br> private int[] findPosition(int childNum) {<br> int[] position = new int[2];<br> for (int i = 0; i < rows; i++) {<br> for (int j = 0; j < columns; j++) {<br> if ((i * columns + j) == childNum) {<br> position[0] = i;//行<br> position[1] = j;//列<br> break;<br> }<br> }<br> }<br> return position;<br> }<br> public int getGap() {<br> return gap;<br> }<br> public void setGap(int gap) {<br> this.gap = gap;<br> }<br> /**<br> * 根据图片个数确定行列数量<br> * 对应关系如下<br> * numrowcolumn<br> * 1 11<br> * 2 12<br> * 3 13<br> * 4 22<br> * 5 23<br> * 6 23<br> * 7 33<br> * 8 33<br> * 9 33<br> *<br> * @param length<br> */<br> private void generateChildrenLayout(int length) {<br> if (length <= 3) {<br> rows = 1;<br> columns = length;<br> } else if (length <= 6) {<br> rows = 2;<br> columns = 3;<br> if (length == 4) {<br> columns = 2;<br> }<br> } else {<br> rows = 3;<br> columns = 3;<br> }<br> }<br> /**<br> * dp to px<br> */<br> public static int dip2px(Context context, double dpValue) {<br> final float scale = context.getResources().getDisplayMetrics().density;<br> return (int) (dpValue * scale + 0.5f);<br> }<br> public void setOnItemClickListerner(OnItemClickListerner onItemClickListerner) {<br> this.onItemClickListerner = onItemClickListerner;<br> }<br> public interface OnItemClickListerner {<br> public void onItemClick(View view, int position);<br> }<br>} |
以上就是短视频平台源码,动态上传的图片以九宫格形式展示实现的相关代码, 更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现