HurryYu 
  • 首页
  • 归档
  • 分类
  • 标签
  • 关于我
  •     

给Android开发者的MavenCentral发布指南

一、前言 本文讲解如何将Android开源库发布到MavenCentral上,属于保姆级教程 MavenCentral会检查开源库包路径对应的域名是否属于你,因此你需要拥有一个域名。比如你开源库的包路径为:com.hurryyu.mylib,则你必须是域名hurryyu.com的拥有者 关于2,域名可以自购,也可以用GithubPage等免费方案,如username.github.io 关于域名,只会在第一次发布时验证域名是否属于你,后续将不再需要 本文将基于自购域名进行讲解 二、注册账号并登录账号浏览器访问https://issues.sonatype.org/注册(Sign up)一个账号,然后登录。 三、创建工单登录后,你可以在网页左上方的菜单栏中看到新建的按钮,如下图所示: 点击后,需要填写一些信息: 项目:Community Support - Open Source Project Repository Hosting (OSSRH) 问题类型:New Project 概要:android lib(或者你也可以填写其它适合的概要信息) 描述(非必填):不管 附件(非必
 2021-12-10   Android技术  我的开源库    maven  sonatype 

Android自定义View实战-边角横幅

有时候,UI可能会设计一个效果,需要我们在View的左上角加上一个横幅,并在横幅上添加文字显示,例如下面这张图的效果: 紫色部分就是我们所说的“横幅”。这个效果如何实现呢?两种方案: UI切图 自定义View实现 UI切图有一些不好的地方,一是如果横幅的文字时动态变化的,那需要对应多张切图;二是切图无疑会增加APK的体积。因此我们选择「自定义View实现」。 一、明确为「谁」而自定义如果我们编写一个自定义View,只是为了给自己的App使用,那么可以考虑得简单一些,不需要对外提供过多的自定义属性,也不需要考虑太多的兼容适配问题;如果是需要公开提供给广大开发者使用,那么就需要考虑提供更多的自定义属性方便大家使用。 在这里,我决定采取后者的方式来定义这个边角横幅View。 二、是自定义View还是自定义ViewGroup考虑到在各个项目中,需要加这种边角横幅的View或ViewGroup的布局差异都是非常大的,因此我们应该提供一个自定义ViewGroup,用户给需要边角横幅的View或ViewGroup套上我们的ViewGroup即可,至于用户要给什么样的内容布局加上边角横幅,我们不
 2020-09-04   Android技术    自定义ViewGroup  Path 

一个案例搞定策略模式

提到设计模式,只要是有过开发经验的开发人员都或多或少听过&用过设计模式,比如我们都能信手拈来的「单例模式」、「观察者模式」等等。当然也有我们平时不太常用,但众多优秀的开源框架中广泛使用的设计模式,例如著名的网络框架retrofit使用的「代理模式」、okhttp使用的「责任链模式」。 关于设计模式的文章,网上一搜一大堆,各位前辈都总结得非常好。可以说前人的技术分享大大降低了后人的学习门槛,使中国互联网整体技术水平成指数上升,感谢每一位热爱分享的Coder! 很早以前我就准备写一篇介绍策略模式的文章,但是始终没有一个较好的例子。在最近的项目中,我再次用到了策略模式,于是我决定将其作为本文讲解策略模式的案例。 本文会先直接通过实际案例的形式逐步带入策略模式,最后再给出策略模式的完整定义,这样更容易理解。 为了不偏离主题,提升阅读体验,本文所有代码都经过精简处理。 一、案例前戏公司参加了某人工智能比赛,AI部门的同事使用TensorFlow训练了一个能根据呼吸音推测患上“肺气肿”概率的模型。需要在Android设备上通过APP + 听诊器完成呼吸音的采集,然后通过模型给出结论。
 2020-08-29   设计模式    策略模式 

彻底搞懂Kotlin的高阶函数、匿名函数、Lambda表达式

在Kotlin还没成为Android开发首选语言之前,我们一直是使用Java语言来开发Android应用。不过对于Lambda来说,大家应该并不陌生,因为Android Studio也可以支持JAVA 8中的Lambda表达式,只需要在app的build.gradle中添加以下代码: android { // ... compileOptions { targetCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8 } } 这个时候,如果你之前给一个按钮加点击事件的代码是这样写的: btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); Android Studio会给你一个提示
 2020-07-30   Kotlin    kotlin  高阶函数  Lambda 

轻松适配Android 10 Scoped Storage 分区存储

Android 10(API 级别 29)引入了多项功能和行为变更,目的是更好地保护用户的隐私权。其中最重要的变化之一就是存储访问权限。 Android 10中,Google针对外部存储引入了一个新特性,它的名字叫:Scoped Storage,Google官方对它的翻译为分区存储,我们也可以把它叫做作用域存储,至于为什么? 本文中,我们还是将它翻译为分区存储。好了,我要开始提问了! 问题一、外部存储?内部存储?内存?1.1、内存有些朋友经常将内存和内部存储搞混,因为内部存储也可以被简称为内存: A:听说你买了新手机?内存多大的啊?后台能开多少啊? B:哈哈,256G,装几百个都不是问题! A:呵呵 但实际上它们是两个不一样的东西。内存(RAM)简单理解就是程序运行时临时的数据存储器,某个程序进程结束后,关于此程序的所有内存数据都会消失,而断电后整个内存里面的数据都会丢失。由于内存经常与CPU打交道,因此它的读写速度是相当快的,内存也是我们通常所说的随机存取存储器(Random Access Memory)。 1.2、内部存储内部存储顾名思义就是手机自带的存储空间,一般情况下,
 2020-04-17   Android技术    适配  Android Q  分区存储 

也许是最详细的EventBus源码解析

EventBus是目前Android开发中流行的事件总线框架,本文假定大家已经熟悉EventBus的基本使用,我们一起来研究EventBus背后的原理。 在开始分析原理前,首先需要告知大家,在本文中: 将调用了EventBus.getDefault().register(this);的类称为注册类 将被@Subscribe注解所标记的方法称为订阅方法 好了,下面我们正式开始 一、基本使用我们来看一个最基本的使用: 1.1、定义事件类首先定义一个事件类EventLoveState: public class EventLoveState { private String loveState; public EventLoveState(String loveState) { this.loveState = loveState; } public String getLoveState() { return loveState; } public v
 2020-01-12   Android技术    源码解析  EventBus  消息总线 

Android以最简单的方式接入支付

很久都没更新过博客了,一来是最近在搞Flutter,二来是有很多事情需要做。就在几天前我开源了一个名叫BestPay的库,使用它可以在Android上非常方便的接入三方支付SDK(微信,支付宝),但未来还会支持更多。这篇文章准备和大家聊一聊Android上常见的支付接入与使用方式。 一、微信支付1.1、官方版相信大家都接入过微信支付,那酸爽也是体会过的吧。在这里我简单介绍一下微信支付的官方集成过程: Gradle中添加依赖 创建wxapi包,并创建名字叫做WXPayEntryActivity的Activity 支付结果也分情况吧,支付成功,支付失败,支付取消等,你需要自己在WXPayEntryActivity里面去判断 App中也许不止一处用到支付吧,需要在WXPayEntryActivity里面判断支付的type,针对不同场景做不同处理 都在WXPayEntryActivity处理支付结果不好吧,你可能又要引入EventBus等将支付结果告知业务Activity 请求服务器获取支付所需的字段值 创建IWXAPI,创建PayReq,开始各种设置支付参数值,最终调用sendReq(
 2019-07-12   我的开源库    开源库 

属性动画详细介绍(一)

属性动画详细介绍(一)[TOC] 属性动画我决定用两篇文章做总结 一、属性动画基础内容 二、ValueAnimator从名字就可以看出,这是针对值的动画,它并不会对View做出任何动画效果。使用ValueAnimator可以让某一个值在设定时间内平滑过渡成另一个值,根据值的变换过程,自己操作View的变换。 2.1、使用ValueAnimator要使用ValueAnimator非常简单,首先通过ValueAnimator提供的静态方法创建其对象,然后设置动画的时长,最后调用start()方法开启动画即可。下面我们来创建一个ValueAnimator,它能在2秒内从0变换到500: ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 500); valueAnimator.setDuration(2000); valueAnimator.start(); 没错就是这么简单,运行后的确在两秒内值从0一直平滑过渡到了500。可是我们需要过程而不是结果呀,如果没办法监听到值变换的过程,就没办法利用变换中的值给View设置动画了。要想监
 2019-05-28   Android技术    属性动画 

Android性能优化之布局优化

管你APP采用了多么高大上的技术,做出了多么炫酷的动画,如果使用起来体验不好,各种花式卡顿,内存占用大得一批的话,估计很少有人愿意愉快地使用.因此我们不能只考虑如何实现功能效果,还必须要重视性能的优化! 本篇文章就从看得见的入手,先来学习如何优化我们的布局,闲话不多说,直接开始. include标签include标签是用于将一个布局引入到当前布局中.举个例子,一般我们的APP几乎每个页面都有标题栏吧,那你需要在每个页面都去写一次标题栏的布局,麻不麻烦?(不麻烦,反正都是ctrl+v,怕个卵),好吧,突然有一天,产品叫你把标题栏中的一个TextView从中间移动到左边,那你就需要去每一个布局文件里面修改代码,你再敢说不麻烦? 因此,我们就可以用include标签来进行优化.首先在res/layout中新建一个layout_title_bar.xml: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.
 2019-02-21   Android技术    布局优化  性能优化 

抛弃onActivityResult,彻底改变startActivityForResult

抛弃onActivityResult,彻底改变startActivityForResult常规写法在Android开发中,我们经常需要启动另一个Activity并得到它返回的数据,常规的写法是这样的: private static final int REQUEST_CODE_BIND_INFO = 42; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { ... Intent intent = new Intent(this, YourActivity.class); startActivityForResult(intent, REQUEST_CODE_BIND_INFO); ... } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(re
 2019-01-29   我的开源库    开源库 
12

搜索

Copyright © 2018 - 2019 HurryYu . All Rights Reserved.
 总访问量 次   总访客数 人