From 39d2b3386ca0a09bc15cc945b93d35aac15c8475 Mon Sep 17 00:00:00 2001 From: liyujiang Date: Fri, 11 Feb 2022 11:13:42 +0800 Subject: [PATCH] first commit --- README.md | 91 ++------------ app/src/main/res/layout/activity_main.xml | 106 ++++++++++++++++- library/src/main/AndroidManifest.xml | 2 +- library/src/main/java/.gitkeep | 0 .../RoundCornerImageView.java | 112 ++++++++++++++++++ library/src/main/res/values/attrs.xml | 29 +++++ screenshot.jpg | Bin 0 -> 20698 bytes 7 files changed, 254 insertions(+), 86 deletions(-) delete mode 100644 library/src/main/java/.gitkeep create mode 100644 library/src/main/java/com/github/gzuliyujiang/RoundCornerImage/RoundCornerImageView.java create mode 100644 library/src/main/res/values/attrs.xml create mode 100644 screenshot.jpg diff --git a/README.md b/README.md index 42e8ead..8741afe 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,22 @@ # 项目说明 -> 2020.05.14 +安卓圆角图片控件,支持分别设置上下左右四个角,通过Path实现绘制,在ListView/RecyclerView里比较丝滑。 -## 开发环境 +![效果图](/screenshot.jpg) -- JDK 1.8 -- Android Studio Latest Version -- Android SDK 30 -- Gradle Latest Version -- Plugin@FindViewByME -- Plugin@GsonFormatPlus +## 例子演示: -## 协作工具 - -- xiaopiu:产品原型协作 -- 蓝湖:UI 设计稿协作 -- git:程序代码协作 - -## 模板文件 - -- .github/workflows 自动化工作流 -- .gitignore 通用的 GIT 版本控制文件忽略规则 -- build.gradle 项目构建管理 -- gradle.properties 通用的项目配置 -- app/proguard-common.pro 通用的混淆规则 -- gradle/common.gradle 通用的项目配置,包括 GIT 提交信息、打包排除文件、静态检查白名单等 -- gradle/config.gradle 构建配置,包括指定 SDK 版本、是否启用 X86 支持、是否启用混淆 -- gradle/dependency.gradle 第三方依赖项集中管理 -- gradle/git.gradle 基于 GIT 进行版本号得到 APP 版本号 -- gradle/publish.gradle 项目打包发布到 Maven 仓库 -- gradle/app.gradle 通用的 APK 打包配置,包括解决依赖冲突、分环境分渠道打包、分包、自动签名、归档备份等 -- gradle/library.gradle 通用的库项目配置 - -## 镜像加速 - -在天朝使用 jcenter、mavenCentral 及 google 三个远程仓库,Gradle Sync 会很慢, -google 仓库甚至需要`科学上网`才能访问。 -为了加快速度,优先用 [阿里云仓库服务](https://maven.aliyun.com/mvn/view) 的仓库作为下载源, -将本项目的[gradle/init.d/init.gradle](/gradle/init.d/init.gradle)复制到`{USER_HOME}/.gradle/`下即可, -`USER_HOME`在 Windows 上大约为`C:/Users/liyujiang/.gradle/`,在 Linux 上大约为`/home/liyujiang/.gradle/`, -`init.d/init.gradle`内容为: - -```gradle -buildscript { - repositories { - maven { url 'https://maven.aliyun.com/repositories/jcenter' } - maven { url 'https://maven.aliyun.com/repositories/google' } - maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } - } -} - -allprojects { - repositories { - maven { url 'https://maven.aliyun.com/repositories/jcenter' } - maven { url 'https://maven.aliyun.com/repositories/google' } - maven { url 'https://maven.aliyun.com/repository/central' } - maven { url "https://www.jitpack.io" } - } -} +```xml + ``` -## 远程真机 - -- 免费 [华为远程真机云调试](https://developer.huawei.com/consumer/cn/agconnect/cloud-adjust) 。 -- 免费 [小米云测平台远程真机租用](https://testit.miui.com/remote) 。 -- 免费 [VIVO 云测平台远程真机](https://vcl.vivo.com.cn/#/machine/picking) 。 -- 免费 [OPPO 云测平台远程真机](https://open.oppomobile.com/cloudmachine/device/list-plus) 。 -- 免费 [三星远程开发测试平台真机调试](http://samsung.smarterapps.cn/index.php?app=home&mod=Index&act=samsung) 。 -- 新人试用 ~~腾讯 WeTest 云真机调试、阿里 EMAS 移动测试远程真机、百度 MTC 远程真机调试、Testin 远程真机测试、AllTesting 真机测试~~ 。 - -## 架构模式 - -模块化/组件化。 - -- 通过模块化/组件化组织代码,面向接口编程,尽可能做到高内聚、低耦合、重复用。 -- 模块可分为多种类型,一般分为:基础库(日志打印、网络请求、图片加载等)、三方包(微信登录、统计分析、消息推送等)、业务组件(会员中心、商城等)。 -- 常见组件间通信方式:直接依赖(耦合太重,不推荐)、事件或广播(难以溯源,不推荐)、路由(如 @alibaba/ARouter)、面向接口(推荐)。 -- 模块化/组件化业务独立,每个业务作为单独的组件,代码实现分离,不会搅在一起。 -- 模块化/组件化便于协作,每个开发人员只关心自己负责的模块/组件,每个模块/组件作为一个子工程,没有太多的耦合。 -- 模块化/组件化便于维护,各模块/组件管理自己的代码、布局、资源,主工程可以方便添加与移除。 - -## 设计模式 - -MVVM:Model-View-ViewModel。使用谷歌架构组件`ViewModel`及`LiveData`或`DataBinding`实现。 - ## 许可协议 ```text diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6b81986..f23c6aa 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -11,14 +11,108 @@ ~ See the Mulan PSL v2 for more details. --> - + android:layout_height="match_parent" + android:orientation="vertical" + android:padding="20dp"> - + + + + + + + + + + + + + android:layout_gravity="center_horizontal" + android:layout_marginTop="10dp" + android:gravity="center" + android:orientation="vertical"> + + + + + + + + + + + + + + + + - \ No newline at end of file + \ No newline at end of file diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index 94bba73..44e074a 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -11,4 +11,4 @@ ~ See the Mulan PSL v2 for more details. --> - + diff --git a/library/src/main/java/.gitkeep b/library/src/main/java/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/library/src/main/java/com/github/gzuliyujiang/RoundCornerImage/RoundCornerImageView.java b/library/src/main/java/com/github/gzuliyujiang/RoundCornerImage/RoundCornerImageView.java new file mode 100644 index 0000000..3da1fd2 --- /dev/null +++ b/library/src/main/java/com/github/gzuliyujiang/RoundCornerImage/RoundCornerImageView.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2016-present 贵州纳雍穿青人李裕江<1032694760@qq.com> + * + * The software is licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package com.github.gzuliyujiang.RoundCornerImage; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Path; +import android.util.AttributeSet; +import android.widget.ImageView; + +/** + * 圆角图片,支持分别设置上下左右四个角 + * + * @author liyujiang + * @since 2018/2/2 + */ +public class RoundCornerImageView extends ImageView { + private static final int CORNER_TYPE_ALL = 0; + private static final int CORNER_TYPE_LEFT = 1; + private static final int CORNER_TYPE_TOP = 2; + private static final int CORNER_TYPE_RIGHT = 3; + private static final int CORNER_TYPE_BOTTOM = 4; + private static final int CORNER_TYPE_LEFT_FALLING = 5; + private static final int CORNER_TYPE_RIGHT_FALLING = 6; + private static final float CORNER_SIZE_DIP = 3; + private final Path path = new Path(); + private float width, height; + private final int cornerType; + private final float cornerSize; + + public RoundCornerImageView(Context context) { + this(context, null); + } + + public RoundCornerImageView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public RoundCornerImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray t = context.obtainStyledAttributes(attrs, R.styleable.RoundCornerImageView); + cornerType = t.getInteger(R.styleable.RoundCornerImageView_lyj_cornerType, CORNER_TYPE_ALL); + cornerSize = t.getDimension(R.styleable.RoundCornerImageView_lyj_cornerSize, CORNER_SIZE_DIP * getResources().getDisplayMetrics().density); + t.recycle(); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + width = getWidth(); + height = getHeight(); + } + + @Override + protected void onDraw(Canvas canvas) { + if (width > cornerSize && height > cornerSize) { + // 左上点 + path.moveTo(cornerSize, 0); + // 上边线 + path.lineTo(width - cornerSize, 0); + // 右上角 + if (cornerType == CORNER_TYPE_ALL || cornerType == CORNER_TYPE_RIGHT || + cornerType == CORNER_TYPE_TOP || cornerType == CORNER_TYPE_LEFT_FALLING) { + path.quadTo(width, 0, width, cornerSize); + } else { + path.lineTo(width, 0); + } + // 右边线 + path.lineTo(width, height - cornerSize); + // 右下角 + if (cornerType == CORNER_TYPE_ALL || cornerType == CORNER_TYPE_RIGHT || + cornerType == CORNER_TYPE_BOTTOM || cornerType == CORNER_TYPE_RIGHT_FALLING) { + path.quadTo(width, height, width - cornerSize, height); + } else { + path.lineTo(width, height); + } + // 下边线 + path.lineTo(cornerSize, height); + // 左下角 + if (cornerType == CORNER_TYPE_ALL || cornerType == CORNER_TYPE_LEFT || + cornerType == CORNER_TYPE_BOTTOM || cornerType == CORNER_TYPE_LEFT_FALLING) { + path.quadTo(0, height, 0, height - cornerSize); + } else { + path.lineTo(0, height); + } + // 左边线 + path.lineTo(0, cornerSize); + // 左上角 + if (cornerType == CORNER_TYPE_ALL || cornerType == CORNER_TYPE_LEFT || + cornerType == CORNER_TYPE_TOP || cornerType == CORNER_TYPE_RIGHT_FALLING) { + path.quadTo(0, 0, cornerSize, 0); + } else { + path.lineTo(0, 0); + } + canvas.clipPath(path); + } + super.onDraw(canvas); + } + +} diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml new file mode 100644 index 0000000..631af72 --- /dev/null +++ b/library/src/main/res/values/attrs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/screenshot.jpg b/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3585cc99eaa68070a1aead79171892418eba3419 GIT binary patch literal 20698 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 ZiC#7v99>01q=>G-h^^=bP@Vk$n*dW`RN4Rl literal 0 HcmV?d00001