# WanAndroidKotlin
基于kotlin实现玩安卓app,目前还继续在开发中,主要是练手kotlin和jetpack
开发环境 macbook、android studio
基于Androidx,使用recyclerview和viewpager2实现页面交互
基于kotlin+viewmodel+livedata实现布局页面
基于kotlin协程+retrofit实现网络请求
抽出基础库,拆分模块,方便开发其他项目
baselibrary->commonlibrary->app
baselibrary->commonlibrary->moduleme
功能介绍:
- 1.首页视差效果滚动banner
- 2.底部菜单切换,状态栏的改变效果
- 3.使用拦截器对Retrofit的出入参数进行挟持修改
```
class WanAndroidInterceptor : Interceptor {
private val TAG = WanAndroidInterceptor::class.java.simpleName
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
val method = request.method()
var response: Response? = null
if ("POST" == method) {
val body = request.body()
//处理请求
if (body is FormBody) {
//https://blog.csdn.net/wenyingzhi/article/details/80510249
val builder = FormBody.Builder()
for (i in 0 until body.size()) {
//这里改为addEncoded
builder.addEncoded(body.encodedName(i), body.encodedValue(i))
LogUtil.i(
TAG,
"WanAndroidInterceptor>>key:" + body.encodedName(i) + ",value:" + body.encodedValue(
i
)
)
}
//增加参数或者加密在这里操作
builder.add("time", SystemClock.elapsedRealtime().toString())
//构造新的请求体,覆盖之前的body
val newRequestBody = builder.build()
//构建新的request
val newRequest = request.newBuilder().post(newRequestBody).build()
//proceed
response = chain.proceed(newRequest)
} else if (body is MultipartBody) {
//后面再考虑
//var builder = MultipartBody.Builder()
//proceed
response = chain.proceed(request)
} else {
response = chain.proceed(request)
}
//处理返回
if (response != null && HttpHeaders.hasBody(response)) {
val responseBody = response.body()
responseBody?.apply {
val source: BufferedSource = source()
source.request(Long.MAX_VALUE) // Buffer the entire body.
val buffer: Buffer = source.buffer()
val charset = Charset.forName("UTF-8")
val content = buffer.clone().readString(charset)
//===打印返回内容,如果解密之类操作,也可以在这里操作
LogUtil.i(
TAG,
"WanAndroidInterceptor>>>>content:$content"
)
//===打印返回内容,如果解密之类操作,也可以在这里操作
if (!StringUtil.isEmpty(content)) {
val obj =
GsonUtil.gson.fromJson<WanResponse<Any>>(
content,
WanResponse::class.java
)
if (obj.errorCode != 0) {
LogUtil.i(
TAG,
"WanAndroidInterceptor>>errorCode:" + obj.errorCode
)
throw ResponseThrowable(obj.errorCode + 1, obj.errorMsg)
}
}
val newResponseBody = ResponseBody.create(contentType(), content)
response = response?.newBuilder()?.body(newResponseBody)?.build()
}
}
}
if (response == null) {
response = chain.proceed(request)
}
return response!!
}
}
```
- 4.对携程请求做了二次封装,简单使用
```
fun asyncExt(
block: suspend CoroutineScope.() -> Unit,
onError: (rt: ResponseThrowable) -> Unit = {},
isLoading: Boolean = false
) {
viewModelScope.launch(CoroutineExceptionHandler { _, e ->
onError(ExceptionHandle.handleException(e))
}) {
try {
if (isLoading) {
zShowLoadingDialog()
}
block.invoke(this)
} finally {
if (isLoading) {
zHideLoadingDialog()
}
}
}
}
```
- 5.对imageview增加类型微信上传文件的交互效果
```
public class DstOutView extends View {
private int mH;
private int mW;
private Paint mPaint = null;
private PorterDuffXfermode mPorterDuffXfermode;
public DstOutView(Context context) {
super(context);
init();
}
public DstOutView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public DstOutView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public DstOutView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
mH = getHeight();
mW = getWidth();
}
/**
* 教程:http://www.360doc.com/content/16/0705/15/21631240_573292156.shtml
*
* @param canvas
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//禁用硬件加速
setLayerType(View.LAYER_TYPE_SOFTWARE, mPaint);
/**
* 设置View的离屏缓冲。在绘图的时候新建一个“层”,所有的操作都在该层而不会影响该层以外的图像
* 必须设置,否则设置的PorterDuffXfermode会无效,具体原因不明
*/
int sc = canvas.saveLayer(-mW / 2f, -mH / 2f, mW + mW / 2f, mH + mH / 2f, mPaint, Canvas.ALL_SAVE_FLAG);
drawBackground(canvas);
mPaint.setXfermode(mPorterDuffXfermode);
drawHollowFileds(canvas);
mPaint.setXfermode(null);
/**
* 还原画布,与canvas.saveLayer配套使用
*/
canvas.restoreToCount(sc);
}
private void drawBackground(Canvas canvas) {
mPaint.setColor(0x88000000);
canvas.drawRect(0, 0, mW, mH, mPaint);
}
private void drawHollowFileds(Canvas canvas) {
mPaint.setColor(Color.YELLOW);
canvas.drawArc(-mW / 2f,
-mH / 2f,
mW + mW / 2f,
mH + mH / 2f,
-90,
360f * progress / 100f,
true,
mPaint);
}
private int progress = 1;
public void setProgress(int progress) {
this.progress = progress;
setVisibility(progress >= 100 ? GONE : VISIBLE);
invalidate();
}
}
```
引用库:
```
//第三方库
def eventbus_version = '3.2.0'
//参考博客文章:https://www.jianshu.com/p/7ed3b4ca0d8b
api "org.greenrobot:eventbus:$eventbus_version"
kapt "org.greenrobot:eventbus-annotation-processor:$eventbus_version"
//https://github.com/square/retrofit
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。
资源推荐
资源详情
资源评论
收起资源包目录
基于kotlin实现玩安卓app,目前还继续在开发中,主要是练手kotlin和jetpack.zip (350个子文件)
ITimerManagerService.aidl 428B
gradlew.bat 2KB
.gitignore 145B
.gitignore 7B
.gitignore 7B
.gitignore 7B
.gitignore 7B
.gitignore 7B
.gitignore 7B
build.gradle 4KB
build.gradle 4KB
build.gradle 3KB
build.gradle 2KB
build.gradle 2KB
build.gradle 2KB
build.gradle 705B
settings.gradle 153B
gradlew 5KB
WebviewSettingProxy.java 20KB
SystemBarTintManager.java 20KB
ListProject.java 18KB
XFloatView.java 15KB
BeeHttpLoggingInterceptor.java 15KB
ZStatusView.java 13KB
FloatWindowPermission.java 12KB
StatusBarUtil.java 11KB
PersistentCookieStore.java 8KB
MiuiUtils.java 8KB
BeeLog.java 8KB
ZStatusViewBuilder.java 6KB
HuaweiUtils.java 6KB
StatusBarCompat.java 5KB
SPUtil.java 4KB
RomUtils.java 4KB
OkHttpStreamFetcher.java 4KB
OSUtils.java 4KB
MeizuUtils.java 3KB
QikuUtils.java 3KB
DstOutView.java 3KB
Utils.java 3KB
OppoUtils.java 3KB
Tree.java 3KB
ProgressManager.java 3KB
OkHttpUrlLoader.java 2KB
User.java 2KB
SerializableOkHttpCookies.java 2KB
ProgressResponseBody.java 2KB
ZViewHolder.java 2KB
StatusBarHeightLinearLayout.java 2KB
DisCUtil.java 2KB
StatusBarHeightRelativeLayout.java 2KB
ContentAdapter.java 2KB
ImageAdapter.java 2KB
FloatView.java 2KB
ListJsonDeserializer.java 1KB
LinearLayoutManagerX.java 1KB
StatusBar28.java 1002B
MyCookieJarImpl.java 937B
ObjectJsonDeserializer.java 906B
ContentView.java 878B
SystemUtils.java 757B
ExampleInstrumentedTest.java 741B
IPermissionApplyPrompter.java 533B
ExampleUnitTest.java 371B
StartFragment.java 345B
StartActivity.java 345B
ZLogUtils.java 295B
OnProgressListener.java 184B
ZStatusViewConvertListener.java 134B
s20191127.jks 2KB
1111111.jks 2KB
bg_login_meinv.jpg 308KB
ZBaseFragment.kt 24KB
SystematicsFragment.kt 16KB
TouchWebView.kt 14KB
WanList.kt 14KB
ZBaseActivity.kt 13KB
OkHttp.kt 12KB
ProjectListFragment.kt 9KB
HomeFragment.kt 9KB
WxArticleListFragment.kt 8KB
MeFragment.kt 8KB
RecentProjectFragment.kt 8KB
RecentBlogFragment.kt 7KB
MainFragment.kt 7KB
Article.kt 6KB
ImageLoadUtils.kt 6KB
StartUtil.kt 5KB
WanAndroidApi.kt 5KB
WebFragment.kt 5KB
StartPage.kt 4KB
ProjectFragment.kt 4KB
WanAndroidInterceptor.kt 4KB
WxArticleFragment.kt 4KB
MemoryStatus.kt 4KB
BaseFragment.kt 4KB
WanOkHttpUtils.kt 3KB
GlobalFragment.kt 3KB
SPUtils.kt 3KB
BaseViewModel.kt 3KB
共 350 条
- 1
- 2
- 3
- 4
资源评论
妄北y
- 粉丝: 1w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功