团队博客-第二阶段冲刺-Day6
团队博客-第二阶段冲刺-Day6
团队任务
完成图片转表格app(TransformMine)的开发
1.统一,简约,漂亮的前端界面
2.完成用户主要功能的开发
3.优化用户体验
4.定时团队任务进行团队任务完成情况的审查
今日完成任务
1.重写需要用到的几个重要的方法
2.调整功能页面的ui布局
今日团队任务关键代码:
package com.transform.transformMine.widget; import android.annotation.SuppressLint; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; import android.widget.ProgressBar; import androidx.annotation.NonNull; import com.scwang.smart.refresh.layout.api.RefreshFooter; import com.scwang.smart.refresh.layout.api.RefreshKernel; import com.scwang.smart.refresh.layout.api.RefreshLayout; import com.scwang.smart.refresh.layout.constant.RefreshState; import com.scwang.smart.refresh.layout.constant.SpinnerStyle; import com.xuexiang.xui.utils.DensityUtils; @SuppressLint("RestrictedApi") public class MaterialFooter extends ProgressBar implements RefreshFooter { public MaterialFooter(Context context) { this(context, null); } public MaterialFooter(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { setVisibility(GONE); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT); setPadding(0, DensityUtils.dp2px(getContext(), 10), 0, DensityUtils.dp2px(getContext(), 10)); setLayoutParams(params); } @Override public boolean setNoMoreData(boolean noMoreData) { return false; } @NonNull @Override public View getView() { return this; } @NonNull @Override public SpinnerStyle getSpinnerStyle() { //指定为平移,不能null return SpinnerStyle.Translate; } @Override public void onStartAnimator(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) { setVisibility(VISIBLE); } @Override public int onFinish(@NonNull RefreshLayout refreshLayout, boolean success) { setVisibility(GONE); return 100; } @Override public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull RefreshState oldState, @NonNull RefreshState newState) { } @Override public void setPrimaryColors(int... colors) { } @Override public void onInitialized(@NonNull RefreshKernel kernel, int height, int maxDragHeight) { } @Override public void onMoving(boolean isDragging, float percent, int offset, int height, int maxDragHeight) { } @Override public void onReleased(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) { } @Override public void onHorizontalDrag(float percentX, int offsetX, int offsetMax) { } @Override public boolean isSupportHorizontalDrag() { return false; } @Override public boolean autoOpen(int duration, float dragRate, boolean animationOnly) { return false; } }
package com.transform.transformMine.widget; import android.content.Context; import android.view.View; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.widget.AppCompatCheckBox; import com.transform.transformMine.R; import com.xuexiang.constant.TimeConstants; import com.transform.transformMine.core.http.api.ApiService; import com.transform.transformMine.core.http.callback.NoTipCallBack; import com.transform.transformMine.core.http.entity.TipInfo; import com.transform.transformMine.utils.MMKVUtils; import com.xuexiang.xaop.annotation.SingleClick; import com.xuexiang.xhttp2.XHttp; import com.xuexiang.xhttp2.cache.model.CacheMode; import com.xuexiang.xhttp2.request.CustomRequest; import com.xuexiang.xui.widget.dialog.BaseDialog; import com.xuexiang.xutil.app.AppUtils; import com.zzhoujay.richtext.RichText; import java.util.List; public class GuideTipsDialog extends BaseDialog implements View.OnClickListener, CompoundButton.OnCheckedChangeListener { private static final String KEY_IS_IGNORE_TIPS = "com.xuexiang.templateproject.widget.key_is_ignore_tips_"; private List<TipInfo> mTips; private int mIndex = -1; private TextView mTvPrevious; private TextView mTvNext; private TextView mTvTitle; private TextView mTvContent; /** * 显示提示 * * @param context 上下文 */ public static void showTips(final Context context) { if (!isIgnoreTips()) { showTipsForce(context); } } /** * 强制显示提示 * * @param context 上下文 */ public static void showTipsForce(Context context) { CustomRequest request = XHttp.custom().cacheMode(CacheMode.FIRST_CACHE).cacheTime(TimeConstants.DAY).cacheKey("getTips"); request.apiCall(request.create(ApiService.IGetService.class).getTips(), new NoTipCallBack<List<TipInfo>>() { @Override public void onSuccess(List<TipInfo> response) throws Throwable { if (response != null && response.size() > 0) { new GuideTipsDialog(context, response).show(); } } }); } public GuideTipsDialog(Context context, @NonNull List<TipInfo> tips) { super(context, R.layout.dialog_guide_tips); initViews(); updateTips(tips); } /** * 初始化弹窗 */ private void initViews() { mTvTitle = findViewById(R.id.tv_title); mTvContent = findViewById(R.id.tv_content); AppCompatCheckBox cbIgnore = findViewById(R.id.cb_ignore); ImageView ivClose = findViewById(R.id.iv_close); mTvPrevious = findViewById(R.id.tv_previous); mTvNext = findViewById(R.id.tv_next); if (cbIgnore != null) { cbIgnore.setChecked(isIgnoreTips()); cbIgnore.setOnCheckedChangeListener(this); } if (ivClose != null) { ivClose.setOnClickListener(this); } mTvPrevious.setOnClickListener(this); mTvNext.setOnClickListener(this); mTvPrevious.setEnabled(false); mTvNext.setEnabled(true); setCancelable(false); setCanceledOnTouchOutside(true); } /** * 更新提示信息 * * @param tips 提示信息 */ private void updateTips(List<TipInfo> tips) { mTips = tips; if (mTips != null && mTips.size() > 0 && mTvContent != null) { mIndex = 0; showRichText(mTips.get(mIndex)); } } /** * 切换提示信息 * * @param index 索引 */ private void switchTipInfo(int index) { if (mTips != null && mTips.size() > 0 && mTvContent != null) { if (index >= 0 && index <= mTips.size() - 1) { showRichText(mTips.get(index)); if (index == 0) { mTvPrevious.setEnabled(false); mTvNext.setEnabled(true); } else if (index == mTips.size() - 1) { mTvPrevious.setEnabled(true); mTvNext.setEnabled(false); } else { mTvPrevious.setEnabled(true); mTvNext.setEnabled(true); } } } } /** * 显示富文本 * * @param tipInfo 提示信息 */ private void showRichText(TipInfo tipInfo) { mTvTitle.setText(tipInfo.getTitle()); RichText.fromHtml(tipInfo.getContent()) .bind(this) .into(mTvContent); } @SingleClick(300) @Override public void onClick(View view) { int id = view.getId(); if (id == R.id.iv_close) { dismiss(); } else if (id == R.id.tv_previous) { if (mIndex > 0) { mIndex--; switchTipInfo(mIndex); } } else if (id == R.id.tv_next) { if (mIndex < mTips.size() - 1) { mIndex++; switchTipInfo(mIndex); } } } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { setIsIgnoreTips(isChecked); } @Override public void onDetachedFromWindow() { RichText.clear(this); super.onDetachedFromWindow(); } public static boolean setIsIgnoreTips(boolean isIgnore) { return MMKVUtils.put(KEY_IS_IGNORE_TIPS + AppUtils.getAppVersionCode(), isIgnore); } public static boolean isIgnoreTips() { return MMKVUtils.getBoolean(KEY_IS_IGNORE_TIPS + AppUtils.getAppVersionCode(), false); } }
作者:冰稀饭Aurora
出处:https://www.cnblogs.com/rsy-bxf150/p/17422081.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端