- 博客(81)
- 资源 (44)
- 收藏
- 关注
原创 Path类中的moveTo和lineTo
1、moveTomoveTo 不会进行绘制,只用于移动移动画笔。结合以下方法进行使用。2、lineTolineTo 用于进行直线绘制。mPath.lineTo(300, 300);canvas.drawPath(mPath, mPaint);默认从坐标(0,0)开始绘制。刚才我们不说了moveTo是用来移动画笔的吗?mPath.moveTo(100, 100);mPath.lineTo(300, 300);canvas.drawPath(mPath, mPaint);把画笔移动
2021-06-24 10:49:10
3030
原创 组件化开发
传统的开发模式是将所有的东西都丢到APP模块里面,项目越做越大,适合组件化开发。组件化分三层:1. 业务逻辑层2. 公共层(第三方库,框架)3. 系统层组件化开发的优势:1.编译速度每一个模块都是Application,只需要单独编译我的这个模块,别的模块不需要编译,节省时间2.超级解耦每个模块都是没有关联的,拆分成各个模块.模块之间是彼此之间是不关联的,彼此之间是没有任何耦合的3.功能重用不需要再copy过来,直接单独依赖这一模块就行4.便于团队开发节省
2021-05-24 11:06:30
2328
6
原创 实现一个网络框架HttpURLConnection
1.写一个接口public interface IHttpRequest { void setUrl(String url); void setData(byte[] data); void setListener(CallbackListener callbackListener); void execute();}2.实现一个线程池,去处理请求,这个是一个单例这里有2个队列:LinkedBlockingDeque和ArrayBlockingQ.
2021-05-17 11:17:09
375
原创 Kotlin实现上传多张图片(包含拍照和相册功能)
效果图:核心代码:清单文件里写上权限:<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example.uploadpictures"> <uses-permission android:name="android.permission.IN
2021-05-12 16:13:37
2675
5
原创 Kotlin自定义View实现一个通用的控件
效果图如下:核心代码如下:open class CommonItemView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, mode: Int = MODE_TEXT) : RelativeLayout(context, attrs, defStyleAttr) { companion object { const val
2021-05-12 10:48:42
1796
原创 Kotlin实现详情页效果
效果图如下:视频演示:核心代码:class MainActivity : AppCompatActivity() { private lateinit var pictureAdapter: DetailBannerAdapter private lateinit var goodAdapter: GoodAdapter private var pictureSize = 0 private val pic1 = "https://img0.baidu.
2021-05-10 17:07:40
245
1
原创 Kotlin中animateLayoutChanges的使用
实现如下的动画效果:核心代码如下:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" and
2021-05-10 11:08:30
333
原创 Kotlin用容器的方式实现单选和多选
多选的效果图:核心代码如下:class MainActivity : AppCompatActivity() { private val mPopupWindow: FilterPopupWindow by lazy { FilterPopupWindow(this) } private val mList = mutableListOf<String>() override fun onCreate(savedInstanceState: Bund
2021-05-08 17:43:02
389
原创 Android和H5相互调用
h5调用app: webview.addJavascriptInterface(object : Object() { @JavascriptInterface fun setPageTitle(title: String) { runOnUiThread { titleTv.text = title }
2021-05-08 10:55:33
415
原创 Kotlin实现单选和多选
最终效果:核心代码:object OrderViewCenter { /** * 创建RadioButton */ fun createTripRadioButton(context: Context, radioId: Int): RadioButton { val btn = RadioButton(context) btn.id = radioId val params = RadioGroup.Layo
2021-05-07 17:00:52
1412
2
原创 Kotlin实现根据网络数据实现单选效果
最终的效果展示:核心代码:先准备数据源:class MainActivity : AppCompatActivity() { private var specialRequestOptionList: MutableList<SpecialRequestOptionListBean> = mutableListOf() override fun onCreate(savedInstanceState: Bundle?) { ..
2021-05-07 10:55:25
229
2
原创 常用锁的使用方法
解决下面这个并发问题public class MainActivity extends AppCompatActivity { private int i = 60000;//共享变量,库存60000 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout
2021-03-26 13:35:47
339
原创 单例模式的5种实现方式
单例模式:简单来说一个类只能构建一个对象特征:1、私有构造函数2、静态方法返回单例类的对象3、保证单例类对象只有一个,要注意多线程场景4、如果单例对象在反序列化时,不会重新创建对象 外面通过暴露的静态方法来创建单例对象懒汉式public class Singleton { private Singleton() {} //私有构造函数 private static Singleton instance = null; //单例对象 //静态工厂方
2021-03-25 14:38:36
342
6
原创 四种引用类型
强引用 Object obj = new Object()软引用 内存不足时回收弱引用 GC到来时回收虚引用 GC回收时会得到一个通知测试软引用 private void testSoftReference() { User user =new User(1,"xiaoming"); SoftReference<User> softReference = new SoftReference<User>(user);
2021-03-25 10:36:27
122
2
原创 实现所有Activity全部销毁
一、使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activity,并且容易理解、易于操作,非常不错!ActivityController类(储存每一个Activity,并实现关闭所有Activity的操作)import android.app.Activityimport java.util.*object ActivityController { private val
2021-03-18 15:53:09
209
原创 Activity生命周期
正常情况下的生命周期Activity启动–>onCreate()->onStart()->onResume()点击home键回到桌面->onPause()->onStop()再次回到原Activity时->onRestart()->onStart()->onResume()退出当前Activity时–>onPause()->onStop()->onDeatory()锁屏时->onPause()->o
2021-03-18 14:01:09
279
原创 应用内跳转Scheme协议
设置协议xiechengtrip://message/approval/detail?approvalId={approvalId}&approvalFlowId={approvalFlowId}2 1、在Androidmanifest.xml中定义scheme <activity android:name=".ui.main.approval.detail.ApproveDetailActivity" android:screenOr
2021-03-18 11:24:02
241
原创 使用控制台给apk签名
将内容复制到控制台: 复制完以后直接点击右键复制控制台中的内容:先选择想要复制的内容 ,然后在窗口标题栏上右击鼠标,再选择菜单“编辑”-“复制”。注意,是在窗口标题栏上右击鼠标,而不是在窗口内。1、先切换目录到2、输入命令jarsigner -verbose -keystore [签名秘钥文件路径] -signedjar [签名后apk的文件路径] [未签名apk的文件路径] [证书别名]例子:D:\Android\Android Studio\jre\bin>j...
2021-03-15 10:43:22
178
原创 Retrofit源码解析
Retrofit的使用1.创建网络请求的接口public interface GetApi { /** * 获取用户信息 * @return * @Query 注解 */ @GET("getUserInfo") Call<UserInfo> getUserInfo(@Query("id") String userId);}2. 创建Retrofit实例private Retrofit retrofit;
2021-01-29 16:36:44
356
2
原创 Okhttp源码解析
Socket和TCP是什么关系?Socket对TCP/IP的一个抽象的实现OSI七层模型 TCP/IPHTTP是处于最底层应用层的协议,负责进行数据的收发,规定类数据的格式,用什么传输?传输借助于下一层协议 TCP协议 传输层协议 传输数据,确定往哪里传?借助TCP的下一层协议网络层协议: IP协议 确定传输的目的地TCP和IP的连接就是借助Socket连接,建立好了Socket连接,我们要来完成HTTP通信的话,就是把我们的数据组装成HTTP的报文,使用Socket的Outp.
2021-01-28 16:56:58
444
原创 okhttp
okhttp分为两个部分:(1)分发器(2)拦截器因为我们的okhttp支持并发的请求,不是一次只帮你处理一个网络请求,它是支持并发的。那么分发器它是帮助我们将我们提交给okhttp的各种请求去进行一个任务的分配,那么提到并发,就想到了并发编程相关的知识点,想到了多线程,想到了线程池,那么分发器她里面就配置了一个线程池。我们的异步请求任务,都会在这个线程池里面去提交一个任务,除了分发器之外呢,还有就是我们的拦截器。okhttp里面有五大默认的拦截器,采用责任链的设计模式。除了
2021-01-27 11:10:00
274
原创 算法题练习
算法题是一串字母判断是否为合法字符串,规则有三 (1).字母可以全部是大写 (2).字母可以全部是小写 (3).可以首字母是大写,其余字母全小写 除此之外全不合法,返回值为布尔型,合法返回True,不合法返回False答案: public boolean isLegalWord(String world) { Pattern pattern1 = Pattern.compile("[a-z]*"); Pattern pattern2 = Pattern.c.
2021-01-26 20:34:52
182
原创 友盟推送小米手机通知栏图标显示问题
最近发现小米手机通知栏的icon显示成了一个灰色的方块,如图所示发现友盟不支持自定义通知图标意思是 小米的设备,是无法自定义图标的,这个显示的默认图标是无法进行修改的。我自己按照小米推送的推送通知的要求,对于icon有特殊要求地址如下https://dev.mi.com/console/doc/detail?pId=2328#_0_3实现的效果如下:然后设置他的颜色Notification notif = new Notification.Builder(.
2021-01-11 16:25:49
3366
原创 LinkedList源码解析二
双向链表的优势:遍历效果优于单向链表。每个节点类似如下结构:定一个静态内部来Node来表示该结构: private static class Node<E> { Node<E> next; Node<E> prev; E element; public Node(Node<E> prev, Node<E> next, E element) { .
2020-11-03 20:01:11
132
原创 LinkedList源码解析一
我们都知道ArrayList称为动态数组集合,所谓的动态数组,并不是说数组的大小可以发生改变,我们都知道,在创建数组的时候都需要指定数组的长度,一旦数组创建,数组的长度是不能改变的。那么ArrayList是如何实现动态数组的方式呢,可以看之前的文章ArrayList源码分析一,概括来说就是调用ArrayList在Add方法进行元素添加的时候,会判断能不能装下新添加的元素,如果能放下就放到数组里面去,如果放不下,ArrayList就会新开辟一个数组,同时将原数组里面的数据拷贝到新数组里面去,同时把添加的元
2020-11-02 11:25:14
125
2
原创 跨进程通信AIDL的使用
绑定服务的过程首先创建一个Servicepublic class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { return new IMyServiceInterface.Stub() { @Override public void basic
2020-10-20 19:29:14
135
原创 ArrayList源码分析四
接下来我们来自定义一个ArrayListpackage com.example.suanfademo;public class MyArrayList<E> { //定义数组,用于存储集合的元素 private Object[] elementData; //定义变量,用于记录数组的大小 private int size; //定义空数组,用于在创建集合对象的时候给elementData初始化 private Object[] em.
2020-10-16 17:10:30
113
原创 ArrayList源码分析三
问题一:ArrayList如何扩容?第一次扩容是10,后面扩容是原来集合大小的1.5倍问题二:ArrayList添加海量数据 ArrayList list =new ArrayList(); list.add("Android"); list.add("Java"); list.add("PHP"); long startTime = System.currentTimeMillis(); for (int i = 0; i < 100000; i+
2020-10-14 17:53:57
157
2
原创 ArrayList源码分析二
ArrayList源码分析ArrayList有三个构造方法:1.无参构造方法 public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }ArrayList中储存数据的其实就是一个数组,这个数组就是elementData,默认大小是10.2.有参构造函数一...
2020-10-13 15:39:15
280
2
原创 ArrayList源码分析一
前言我们知道如果在一个已知数组 int[] array ={1,2,3,4}里面再追加一个元素5,我们不能直接把元素添加到数组后面,因为数组的长度是不可以改变的,常见的方法是创建一个新的数组,而且需要把原来数组里面的元素一个一个的拷贝进来,然后在新数组后面添加元素。这个过程非常的麻烦,既要创建新的数组又要移动数组的元素。如果我们想要删除一个索引下面的元素;例如一个数组 int[] array ={1,2,3,4},我想把索引2下面的元素3删除掉,数组长度变成3,使数组变成 int[] array =
2020-10-12 19:25:45
128
原创 我们在桌面上打开一个应用经历的流程
一个APP的创建是从ActivityThread.main()开始的。 public static void main(String[] args) { Looper.prepareMainLooper(); //开启消息队列循环 ActivityThread thread = new ActivityThread(); thread.attach(false, startSeq); ...
2020-10-09 16:15:39
388
原创 ScrollView+ListView滑动冲突Demo
知识点: 一个典型的触摸事件会经历,DOWN->MOVE->UP。通过MotionEvent我们可以得到相应触摸事件发生的坐标x、y。为此,系统提供了两组方法获取事件坐标。getX/getY和getRawX/getRawY。这两组方法是有区别的,getX/getY返回的是相对于当前View左上角的x和y坐标,而getRawX/getRawY返回的是相对于手机屏幕左上角的x和y坐标。本例是Scrollview嵌套ListView的demo。<?xml version=..
2020-10-09 11:15:49
162
原创 事件分发机制和滑动冲突
事件的种类事件的种类 意思 diapatchTouchEvent 手指按下 View onInterceptTouchEvent 手指在 View 滑动 onTouchEvent 手指抬起 要注意的是 Activity 和 View 是没有 onInterceptTouchEvent() 方法的。事件分发流程测试代码public class MainActivity extends AppCompatActivity ...
2020-09-27 14:52:13
341
原创 内联函数inline
内联函数内联函数的语义很简单:把函数体复制粘贴到函数调用处。inline fun myCalculate(a: Int, b: Int) = a + bfun test() { myCalculate(1, 2) myCalculate(3, 4) myCalculate(5, 6)}用关键字 inline 标记函数,该函数就是一个内联函数。还是原来的 test() 方法,编译器在编译的时候,会自动把内联函数 myCalculate() 方法体内...
2020-09-03 10:09:16
246
原创 Handler发送消息的方式
方式1:使用 Handler.sendMessage()此处以 匿名内部类 的使用方式为例步骤1:在主线程中 通过匿名内部类 创建Handler类对象 private Handler mhandler = new Handler(){ // 通过复写handlerMessage()从而确定更新UI的操作 @Override public void handleMessage(Message ms
2020-08-13 10:12:22
6401
原创 HandlerThread
HandlerThread是什么HandlerThread继承自Thread,因此HandlerThread其实就是一个线程。线程开启时也就是run方法运行起来后,线程同时创建一个含有消息队列的looper,并对外提供自己这个对象的get方法,这就是和普通的Thread不一样的地方。可用于多个耗时任务要串行执行。使用流程1.实例对象,参数为线程名HandlerThread handlerThread = new HandlerThread("handlerThread");2.启动线
2020-08-12 13:48:46
508
原创 主线程给子线程发送消息
package com.example.customviewdemo;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.view.View;.
2020-08-12 09:52:27
932
原创 Kotlin学习之集合
Kotlin严格区分可变集合和不可变集合,要清楚的一点是,区分开可变集合的只读视图与实际上真正不可变的集合override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main20) var stringList: MutableList<String> = mut
2020-08-01 10:10:44
431
原创 Kotlin学习之解构声明
解构声明在map中的具体使用 val map = mapOf<String, String>("a" to "aa", "b" to "bb", "c" to "cc") for ((key, value) in map) { println("key:$key,value:$value") } map.mapValues { entry -> "${entry.value} hello" }.forEach
2020-08-01 09:41:42
301
CoordinatorLayouts
2018-07-11
TagTextView 每一行添加多个活动标签
2018-06-28
RecyclerView 最新添加的item在最上面
2018-04-26
PopupWindow里面动态添加内容
2018-04-26
PopupWindow 一般商城都用得到 有综合排序
2018-01-08
标签控件 流式布局 实现多选
2018-01-05
标签控件 流式布局 实现单选
2018-01-05
实现热门标签控件 FlowLayout
2017-12-19
RecyclerView之ItemDecoration由浅入深 练习Demo
2017-12-13
DialogFragmentDemo.7z
2020-07-16
LiveUserDemo.7z
2020-07-15
TinkerDemo.7z
2020-07-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人