自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

许佳佳的博客

热爱生活,热爱技术,热爱互联网,热爱祖国。

  • 博客(350)
  • 资源 (60)
  • 收藏
  • 关注

原创 由浅入深学习android input系统(一) - input事件如何传递到View

概述”View的事件分发“对于大多数android开发者而言都是比较熟悉的。对此还不了解的读者,推荐看下笔者的相关文章:完全理解android事件分发机制那么这个事件究竟是如何从“触摸屏幕”到“View处理事件”的呢?本系列将针对此疑问展开。ViewRootImpl对事件的传递View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过ViewRootImpl将更新U

2021-05-24 08:51:07 1577 5

原创 【StudyWebView】android webview架构的一种新思路

github项目地址https://github.com/Double2hao/StudyWebviewStudyWebView架构StudyRouter架构如上图,主要几个模块的功能如下:webview客户端的webview,可以是view,也可以是界面。H5运行于webview上,webview是H5与客户端交互的媒介。BridgesBridges处于业务进程。H5通过单一的通道来调用客户端的功能,由于客户端部分业务会处于业务进程,因此webview会将需要调用业务进程的逻辑封装成b

2021-04-06 20:53:19 561

原创 由浅入深 学习 Android Binder(十)- 总结

概述笔者在大学学习Android时也一直对Binder非常有兴趣,奈何多次探索,多次无功而返。现在想想,不仅是缺乏Binder实践的经验,更多的也是故步自封,没有考虑过直接剖析native层源码来理解binder。(那时候总想着java层都还没搞明白,直接看native层没有意义)后来随着工作经验的积累,对Binder和多进程也有一定的实践经验,再次回顾时,发现很多细节也是可以理解了,于是就开始思考如何去整理Binder这一些系列的知识。我个人非常明白,不能”直接开始解析某个类“地来写,这样的后果就

2021-01-17 11:35:16 786 2

原创 鸿蒙 harmonyos DevEco-Studio 报错 UNINSTALL_FAILED_INTERNAL_ERROR

问题排查方案1、确认是否正确安装了hdc2、查看hap 是否编译成功3、尝试使用hdc安装

2022-07-18 09:03:24 1307 2

原创 常用adb 命令 整理

查看当前界面Activity:adb shell “dumpsys activity top | grep ACTIVITY | tail -n 1”查看Activity任务栈(仅适用android11以及以上):adb shell “dumpsys activity activities | grep ‘* ActivityRecord{’”查看当前界面Fragment:adb shell “dumpsys activity top | grep '#[0-9]: ’ | tail -n 1”

2022-04-17 16:15:37 2995

原创 sql学习-with as的使用-分析数据得到结果

概述当前有一张“学生成绩表”需要查询男女的及格率。例子create table StudentScore ( name string, score int, sex string);INSERT INTO StudentScore VALUES('AAA',32,'man'),('BBB',58,'man'),('CCC',82,'man'),('DDD',44,'woman'),('EEE',92,'woman');select查询with as作用:定义一个S

2022-03-13 17:11:26 1116

原创 GradientDrawable 获取单一颜色

概述GradientDrawable 虽然功能很强大,在平时的使用中,有很多场景只会使用其形状相关的功能,比如用来画一个圆形或者画一个圆角矩形,一般代码会如下: View vTest = findViewById(R.id.v_main_test); GradientDrawable gradientDrawable = new GradientDrawable(); gradientDrawable.setColor(0xFFFF0000);

2022-02-12 20:22:34 1678

原创 SQL学习- case when then else

场景当前有一张“学生成绩表”需要查询有哪些学生及格,哪些不及格。例子create table StudentScore ( name string, score int);INSERT INTO StudentScore VALUES('AAA',32),('BBB',58),('CCC',62),('DDD',92);select查询select name,case when score >= 90 then '优秀'when score >= 60

2021-12-19 10:10:24 287

原创 SQL学习-alter-添加新的字段

概述当开发者自己维护table时,经常会碰到更改表的结构的场景。这时候就需要用到alter。需要注意的是,在更改table的结构时,倘若是新增了字段,那么需要通过update来给新的字段赋值。Democreate table Person ( name string, age int);insert into Person values("AAA",16),("BBB",10),("CCC",20);-- 插入新的字段alter table Person add adult

2021-12-12 20:40:27 4258

原创 SQL学习-group by-多表分组场景

场景当前有两张表:商品售卖历史表、商品信息表需要输出的结果:当前售卖商品的数量汇总。例子CREATE TABLE SellCheck (goods_id string,sell_number int);INSERT INTO SellCheck VALUES("111",3),("222",6),("111",4),("111",5),("222",2);CREATE TABLE GoodsList (id string,name string);INSER

2021-12-05 16:27:27 807

原创 Android activity动画无效问题汇总

概述android activity动画是一个比较简单的功能。但是使用时总会由于各种小问题导致动画失效,笔者根据自己经验,整理了各种可能导致的原因,期望能对你有所帮助。activity动画方式在AndroidMenifest中添加activity的动画属性windowAnimationStyle <item name="android:windowAnimationStyle">@style/anim_fade</item>在activity代码中添加 overr

2021-10-31 10:47:23 3307

原创 android 圆角实现方案小结

概述在实际工作中,android经常有需要实现圆角的场景。笔者根据自己的经验,整理了下几种可行的圆角实现方案,分别适合不同的场景,期望能够对你有所帮助。方案类型一、定义drawable文件二、自定义需要实现圆角的View三、自定义圆角View的父布局四、使用第三方库一、定义drawable文件例子<shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners androi

2021-10-23 09:41:34 3267

原创 Rxjava 源码解析(三) - Schedulers默认线程池

概述前文已经分析过rxjava中我们常见用法的一些源码,还没有了解的读者推荐看下:Rxjava 源码解析(一) - subscribe源码Rxjava 源码解析(二) - 线程切换源码本文将分析下rxjava线程池相关的源码。本文的内容大概有以下:Scheduers.io()源码线程工厂RxThreadFactory源码线程池CachedWorkerPool源码Worker的创建与调用Scheduers.io()源码rxjava内置的线程池除了io,还有newThead,singl

2021-08-28 08:47:18 1352

原创 Rxjava 源码解析(二) - 线程切换源码

概述前文已经讲了rxjava 简单subscribe的源码,有兴趣的读者可以看下。Rxjava 源码解析(一) - subscribe源码本文将基于前文的分析,继续讲下rxjava中断线程切换。Demo主要逻辑如下:Observable调用create()创建 ObservableCreateObservableCreate调用map,返回ObservableMapObservableMap调用subscribeOn,返回ObservableSubscribeOn返回Observable

2021-08-20 09:15:54 330

原创 Rxjava 源码解析(一) - subscribe源码

概述rxjava的应用还是较为广泛的,在实际项目中经常与MVP一起使用,可以使代码的可读性更高。在较为复杂的一些场景下,也可以使代码更加的简洁。本文将会是对rxjava源码的探索,适合已经对rxjava的使用有一定经验的读者。对MVP有兴趣的读者可以看下笔者的前文:MVC、MVP、MVVM小记同步Demo主要逻辑如下:Observable调用create()创建 ObservableCreateObservableCreate调用map,返回ObservableMapObservab

2021-08-19 08:13:57 773

原创 EventBus源码解析

概述本篇内容适合对EventBus有兴趣,或者已经对EventBus有一定使用经验的读者。如果读者此前还没有具体使用过EventBus,推荐阅读下笔者前文:android为什么要用EventBusregister关键逻辑:遍历当前注册的类,获取其中使用了eventBus注解的方法。将这些方法都注册到两个HashMap中,分别是subscriptionsByEventType和typesBySubscriber。通过synchronized加锁,来保证线程安全。subscripti

2021-08-15 09:32:22 218

原创 greenDao 在 qigsaw中报错Could not init DAOConfig

报错org.greenrobot.greendao.DaoException: Could not init DAOConfig场景使用qigsaw宿主模块依赖 greenDAO插件模块使用了greenDAO插件模块使用greenDAO报错:Could not init DAOConfig原因greenDAO源码中通过反射的方式去调用Properties类宿主模块加载greenDAO的ClassLoader是 PathClassLoader插件模块加载AbstractDao实现类

2021-08-05 08:16:41 817

原创 由浅入深学习android input系统(五) - input系统的启动

概述前文已经讲过了input系统对事件的抓取以及传递,此文将探索下input系统的启动。input系统的初始化调用的任务栈如下:SystemServer.main()SystemServer.run()InputManagerService构造函数InputManagerService.nativeInit()com_android_server_input_InputManagerService.nativeInit()NativeInputManager构造函数InputManag

2021-07-05 07:52:24 599

原创 Android 点击无效问题总结

概述近期碰到比较坑的点击无效的问题,尝试了多种解决方案,最终解决。于是,趁热打铁,做个问题与解决方案的总结,期望能对你有所帮助。点击无效的原因View没有设置点击事件View被其他View遮盖父View拦截了事件被其他window遮盖排查与解决View没有设置点击事件打断点或打log,确认设置点击事件的代码有执行到。View被其他View遮盖可以通过Android studio的工具“Layout Inspector”来协助排查,确认没有被其他View遮盖。父View拦截了事件

2021-06-28 07:44:17 5753 3

原创 由浅入深学习android input系统(四) - input事件采集(InputReader)

概述前面讲到,系统进程是通过InputDispatcher将事件分发给app进程的。前文地址:那么InputDispatcher的事件又是从哪里来的呢?android是怎么收到硬件层的事件的呢?本文将对此进行探索。InputReader本身的答案就是在InputReader这个类中,InputReader会启动一个线程一直循环处理逻辑,主要做两件事:获取硬件设备的事件将获取到的原始数据进行处理后传递给InputDispatchervoid InputReader::loopOnc

2021-06-21 08:52:01 784 2

原创 由浅入深学习android input系统(三) - InputChannel解析

概述根据前文分析,InputDispatcher将事件分发给app进程是通过InputChannel,那么InputChannel又是什么时候建立的呢?InputChannel的初始化InputChannel初始化,调用任务栈如下:ViewRootImpl.setView()IWindowSession.addToDisplay()等同于 WindowManagerService.addToDisplay()WindowManagerService.addWindow()WindowSta

2021-06-15 09:10:53 1599 4

原创 由浅入深学习android input系统(二) - input事件如何传递到app进程( InputDispatcher )

概述前文已经解析的内容是:app进程在接收到input事件后,最终传递到View,经过了哪些操作。本文将继续探索 android input系统,分析下系统进程是怎么将input事件传递到app进程的。InputDispatcher的事件分发系统进程的input事件都通过InputDispatcher这个类来进行分发。比如当有触摸事件发送过来时,InputDispatcher会对其进行判断来分发给哪个进程,哪个window。调用任务栈如下:InputDispatcher.dispatchOnc

2021-06-08 08:18:37 1431 5

原创 Android 混淆 小结

概述官方依赖文档:https://developer.android.com/studio/build/shrink-code?hl=zh-cn不管是独立开发app还是开发aar,混淆都是必须了解的一个模块。混淆作用缩小包大小使关键代码对外不可读开启混淆将minifyEnabled设置为true,就可以打开混淆proguard-android-optimize.txt ,是android预设的混淆规则,包含了大多数常用的混淆规则,比如activity的名字不混淆。proguar

2021-06-01 08:27:00 308 3

原创 ViewRootImpl源码解析 (二) - 事件分发

概述前文链接:ViewRootImpl源码解析 (一) - View的更新前文讲了ViewRootImpl中View更新相关的逻辑,此文将讨论下ViewRootImpl中的事件分发逻辑,或者说是事件回传逻辑。此处先列出笔者的个人对ViewRootImpl的理解,如有问题欢迎评论指正。View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过ViewRootImpl将更新

2021-05-20 09:08:40 562

原创 ViewRootImpl源码解析 (一) - View的更新

概述前文讲解了windowManager.addView() 源码相关的知识,有兴趣的读者可以看下:前文讲到ViewRootImpl,但是属于浅尝辄止,没有继续深入了,因此笔者再开几篇文章,继续深入讲下ViewRootImpl的源码。此处先列出笔者的个人对ViewRootImpl的理解,如有问题欢迎评论指正。如下:View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过

2021-05-10 08:07:18 894 6

原创 Android Window系列(二)- windowmanager.addview源码解析(View的更新)

概述前文讲解了window与decorview相关的知识点,有兴趣的读者可以看下:本文将继续探讨下window与view的关系,主要针对“如何在window中添加view”来进行探索。如何在window中添加View这样的场景有非常多,有如下例子:activity在启动的时候向window中添加viewdialog在启动的时候向window中添加viewtoast在启动的时候向window中添加view悬浮窗activity在启动的时候向window中添加view相关逻辑的任务栈调用

2021-05-06 07:57:32 2374

原创 我们越多地理解世界,也就越多地理解自己

近期看了罗翔老师的读书课程,过往经历浮现眼前,一下子突然想明白很多事情。总觉得这些想法对于自己而言应当是宝贵的东西,自己不想它们只在脑中一晃而过,于是作此文记录一下。应当是有较大的个人偏见,也没有抱着要教育读者的姿态,如有滑稽搞笑的地方,期望读者能一笑而过,当然也欢迎评论交流。读书仅为了补全自己心中的世界我初中班主任老师经常会给我们传递一种观念,就是要”多读书”。至于为啥要多读书,我其实并不知道,也就是在这样观念的教育之下,我初中读了大量的书籍,比如有学校特别推荐的《钢铁是怎样练成的》,有恶补小学

2021-05-01 18:32:06 400

原创 Android Input子系统为什么要使用socket,而不是binder?

概述此文出自笔者回答的一个知乎问题,原问题:Android Input子系统为什么要使用socket,而不是binder?Android Input子系统为什么要使用socket,而不是binder?近期正好学习到Binder与input系统相关的知识,觉得这个问题非常有意思。使用socket而不使用binder的原因非常多,笔者仅根据自己的认知回答一下,一定会有考虑不周的地方,有想法的读者可以评论补充或者交流。如果使用binder,会有哪些问题?binder与socket相比太耗资源了。

2021-04-27 21:03:00 1290

原创 Android Window系列(一)- window与decorview

概述window是android中非常常见的一个概念。Activity、Dialog、Toast这些常用的知识点都是和window密不可分的。因此,笔者整理了下window相关的知识,期望能对需要的读者有所帮助。window官方描述Window源码中对window的描述如下:/** * Abstract base class for a top-level window look and behavior policy. An * instance of this class should

2021-04-25 07:50:02 4920 6

原创 android gradle 多渠道打包小结

概述多渠道对于android来说是一个比较常见的概念,举几个常见的用法:根据不同的渠道使用不同的资源根据不同的渠道使用不同的依赖根据不同的渠道作不同的数据统计根据不同的渠道,游戏app中对应不同的服务区github地址本文项目基于笔者自己写的demo,对其有兴趣的读者可以自行下载:https://github.com/Double2hao/MultiChannelTestandroid studio的多渠道如果要使用多渠道,仅需要在该项目的build.gradle文件中增加以下代码:

2021-04-08 20:57:15 3296 3

原创 由浅入深 学习 Android Binder(十一) binder线程池

Android Binder系列文章:由浅入深 学习 Android Binder(一)- AIDL由浅入深 学习 Android Binder(二)- bindService流程由浅入深 学习 Android Binder(三)- java binder深究(从java到native)由浅入深 学习 Android Binder(四)- ibinderForJavaObject 与 javaObjectForIBinder由浅入深 学习 Android Binder(五)- binder如何在.

2021-03-22 08:51:19 5856 3

原创 android aar 自动引入依赖

概述android 生成aar后,引用此aar的项目不会自动引用 aar中的依赖,一般情况下,需要开发者在使用这个aar的项目中再自己手动添加需要的依赖。那么如何能让一个项目引用aar后,自动引入相关的依赖呢?实现方式上传aar到maven仓库前,修改maven中的pom文件,在其中写入aar相关的依赖。build.gradle代码plugins { id 'com.android.library' id 'maven'}android { compileSdkVersion

2021-03-13 19:32:48 1217 2

原创 迁移或备份csdn文章小结

概述一直想要备份下自己CSDN的文章,目前光原创的就有300多篇,完全手动备份太耗时间,于是准备写代码来实现。大概思考了下,备份差不多需要以下几部分:备份文章的markdown文件备份所有文章中的图片(毕竟很多都是亲手画的,都是心血)替换所有markdown文件中图片的url最终效果最终备份了300多篇文章和400多张图片,总共700多个文件,如下图:下载所有图片和替换所有url的总耗时 2分29秒,如下图:备份markdown这个部分直接在github上找到了现有的项目,相关项

2021-03-13 19:25:35 362 2

原创 android小程序多任务栈管理

概述微信小程序要知道什么是小程序的任务栈管理,直接看微信小程序即可:一次最多启动5个小程序小程序启动到达上限后,会关闭最久未使用的小程序,并且打开新的小程序。微信小程序使用时,如下图:实现要点小程序的任务栈管理,主要有以下要点:如何启动多个任务栈的小程序如何限制任务栈的启动个数DemoDemo的github地址如下:https://github.com/Double2hao/ProcessTaskTestDemo如下图:Demo中打开多任务栈的场景如下:关键实

2021-03-02 07:17:48 1013

原创 android监听软键盘弹出弹回事件

概述针对“软键盘的遮挡”问题,最简单的方式就是将activity的windowSoftInputMode设置成adjustResize或者adjustPan。android:windowSoftInputMode="adjustResize"android:windowSoftInputMode="adjustPan"其效果一般如下: 如上图,这样设置后能保证“当前操作的布局”在软键盘之上。但是实际业务场景,可能需要的是“将整块布局”设置在软键盘之上,即Demo中的两个输入框和按钮都需要在软

2021-02-11 07:50:15 4424 3

原创 Android 进程恢复

概述在android多进程的场景中,进程被意外杀死的情况非常场景,可能是用户手动杀死进程,也有可能是操作系统内存不够主动回收。某个进程被杀死,会导致其他进程与这个进程的通信失效,因此,一旦发生这种情况,就需要在其他进程,对这个被杀死的进程作“进程恢复”。进程恢复重要步骤在进程死亡的时候重启进程。检查进程间通信逻辑,如果失效需要做恢复。此处的恢复,简单来说就是一些初始化操作,可能包括io,网络等操作。DemoDemo 的github地址:https://github.com/Doubl

2021-02-10 11:08:08 585

原创 Android跨进程传图片(解决TransactionTooLargeException)

跨进程传图片方案直接intent传bitmap使用文件读写intent传递自定义binder,binder中传递image使用网络传输直接intent传bitmap优势使用简单劣势相关代码可能有侵入性,必须在四大组件中接收。intent传递数据的总大小是1MB,其中还包括启动四大组件相关的信息。因此使用intent传递的图片不宜超过500KB,甚至应该更小,因为还可能会传递其他数据。如果通过此方案传递大图片,必须先压缩后传输。开发者需要自己评估业务场景是否适用,毕竟很多场景不

2021-02-10 07:28:21 954 3

原创 序列化小结

为什么要序列化wiki的描述如下:序列化在计算机科学的资料处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。笔者个人理解如下:序列化:“把当前环境的数据结构 转化成一种 可存储 或者 可传输的形式” 的过程。反序列化:”这种可传输或者可存储的形式 还原成 当前环境的数据结构“的过程。此处为了便于读者理解举个例子:现在有一个 Student类,有name,age等参数。需求一

2021-02-09 06:29:49 264

原创 由浅入深 学习 Android Binder(九)- service_manager 与 svclist

概述前文讲过了java层与native层的IServiceManager,两者最终其实都是通过transact方法 走到了binder driver。之后binder driver便会把工作交给service_manager来处理,这个类的path是/frameworks/native/cmds/servicemanager/service_manager.c。前文地址:由浅入深 学习 Android Binder(七)- IServiceManager与ServiceManagerNative(

2021-01-17 11:26:39 911 2

原创 由浅入深 学习 Android Binder(八)- IServiceManager与BpServiceManager(native层)

概述前文已经讲解过java层ServiceManager的逻辑,如果没有了解过的读者建议看下:由浅入深 学习 Android Binder(七)- IServiceManager与ServiceManagerNative(java层)此文承接前文,继续讲下在native层的IServiceManager,具体的path是/frameworks/native/libs/binder/IServiceManager.cpp。native层还有/frameworks/native/cmds/servi

2021-01-11 08:34:26 1980

onMeasure简单方法 完美解决ListView与ScollView!

近期做项目碰到ScrollView与Listview冲突的情况,查看了网上一些解决listview和scollView的冲突的方法,最终选择了重写onMeasure的方法来解决这个问题。 在此对各种方法做一个个人的总结评价。 主要的方法有四种: 1、手动设置ListView高度(比如把高度设置为200dp) 评价:特别简单无脑,但是大大提高了代码的耦合性,比较适合“图方便”的新手。 2、使用单个ListView的addHeaderView()方法(给listview设置顶部固定的一个view) 评价:比较简便的方法,但是如果顶部布局需要监听滑动事件,也不可取。 3、使用LinearLayout取代ListView(重写LinearLayout) 评价:完全可行,但是让一个LinearLayout来实现Listview的功能真的觉得好奇怪啊。 4、重写ListView的onMeasure() 评价:只需要写几行代码,轻松解决冲突问题。不仅降低代码耦合性,而且简单。唯一的缺点,可能就是理解需要花比较多的时间。

2016-05-22

残缺棋盘 android实现颜色填充

原“残缺棋盘”题目: 残缺棋盘是一个2^k*2^个方格的棋盘,其中恰有1个方格残缺。图中给出,其中残缺部分用阴影表示。 这样的棋盘称为"三格板",残缺棋盘问题就是用这四种三格板覆盖更大的残缺棋盘。再次覆盖中要求: (1)两个三格板不能重复。 (2)三格板不能覆盖残缺棋盘方格,但必须覆盖到其他所有的方格。 添加要求: 使用图形化界面实现颜色填充残缺棋盘

2016-05-17

实验四 常微分方程的数值解

实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验三博客地址:http://blog.csdn.net/double2hao/article/details/51344145 【实验内容】 分别写出改进欧拉法与四阶龙格库塔求解的算法,编写成熟上机调试出结果,要求所编程序适用于任何一阶常微分方程的数值解问题,即能解决这一类问题,而不是某一个问题。 试验中以下列数据验证程序的正确性。 求 y'=-xy^2 y(0)=2 (0<=x<=5) 步长h=0.25

2016-05-11

实验三 数值积分(android)

实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 一、实验内容 分别写出变步长梯形法和romberge法计算定积分的算法,编写程序上机调试出结果,要求所编程序适用于任何类型的定积分,即能解决这一类问题,而不是某一个问题。 试验中以下列数据验证程序的正确性。 求 (sinx)/x的积分,积分区间为[0,1]

2016-05-08

android图片轮播效果,RollViewPager的简单使用

图片轮播算是我们用的比较多的一个功能,我之前也写过类似的文章(http://blog.csdn.net/double2hao/article/details/48896297),但是说实话自己写并不是特别方便,而且往往bug会比较多。而在github上有一些大神专门写了viewpager的轮播框架并且开源,供大家学习参考,这篇博客就教大家如何简单地使用开源框架RollViewPager。 对RollViewPager有兴趣,或者希望更深入学习的可以直接去github下载源码学习:https://github.com/Jude95/RollViewPager

2016-05-06

android RecyclerView布局

android RecyclerView布局 博客地址 :http://blog.csdn.net/double2hao/article/details/51177594 笔者个人看法,RecyclerView只是一个对ListView的升级版,这个升级的主要目的是为了让这个view的效率更高,并且使用更加方便。 我们知道,ListView通过使用ViewHolder来提升性能。ViewHolder通过保存item中使用到的控件的引用来减少findViewById的调用,以此使ListView滑动得更加顺畅。但这种模式在listview中即使不使用也无妨。 换言之,在ListView中你不考虑复用的问题也可以,只是你牺牲了内存来方便了代码。但是RecyclerView就不允许你这么做了,你使用RecyclerView就意味着你一定要复用,而效果上其实和ListView+ViewHolder差不多。

2016-04-22

实验二 插值方法(android)

一、实验内容 分别写出拉格朗日插值法与牛顿插值法的算法,编写程序上机调试出结果,要求所编程序适用于在任何一组插值节点,即能解决这一类问题,而不是某一个问题。 试验中以下列数据验证程序的正确性。 已知下列函数表 X 0.56160 0.56280 0.56401 0.56521 Y 0.82741 0.82659 0.82577 0.82495 求X=0.5635时的函数值。

2016-04-22

android RecyclerView布局真的只是那么简单

RecyclerView是什么? 笔者个人看法,RecyclerView只是一个对ListView的升级版,这个升级的主要目的是为了让这个view的效率更高,并且使用更加方便。 我们知道,ListView通过使用ViewHolder来提升性能。ViewHolder通过保存item中使用到的控件的引用来减少findViewById的调用,以此使ListView滑动得更加顺畅。但这种模式在listview中即使不使用也无妨。 换言之,在ListView中你不考虑复用的问题也可以,只是你牺牲了内存来方便了代码。但是RecyclerView就不允许你这么做了,你使用RecyclerView就意味着你一定要复用,而效果上其实和ListView+ViewHolder差不多。

2016-04-18

android RecyclerView布局真的只是那么简单!

笔者个人看法,RecyclerView只是一个对ListView的升级版,这个升级的主要目的是为了让这个view的效率更高,并且使用更加方便。 我们知道,ListView通过使用ViewHolder来提升性能。ViewHolder通过保存item中使用到的控件的引用来减少findViewById的调用,以此使ListView滑动得更加顺畅。但这种模式在listview中即使不使用也无妨。 换言之,在ListView中你不考虑复用的问题也可以,只是你牺牲了内存来方便了代码。但是RecyclerView就不允许你这么做了,你使用RecyclerView就意味着你一定要复用,而效果上其实和ListView+ViewHolder差不多。

2016-04-18

实验一 直接法解线性方程组(android)

一、实验目的 掌握Guass列选主消去法,三角分解法解线性方程。 二、实验内容 分别写出Guass列选主元消去法,三角分解法的算法,编写程序上机调试出结果,要求所编程序适用于任何线性方程组问题,即能解决这一类问题,而不是某一个问题。 实验中以下列数据验证程序的正确性 1、Guass列选主元消去法 [2.5 2.3 -5.1][x1] [3.7] [5.3 9.6 1.5][x2]=[3.8] [8.1 1.7 -4.3][x3] [5.5] 2、Doolittle三角分解法 [ 2 10 0 -3 ] [-3 -4 -12 13] [ 1 2 3 -4 ] [ 4 14 9 -13]

2016-04-14

android 自定义控件(底部icon点击效果)

主要实现的功能: 1、在java代码中动态设置底部控件的icon和text。(搭配fragment的时候特别方便) 2、text点击时会加粗 3、封装成自定义控件,更加方便。 (考虑到新手可能不易理解,笔者代码没有多加功能) 把底部icon做成自定义控件的优势: 1、搭配fragment或者viewpager使用的时候更加方便,避免写过多重复性代码。 2、代码维护起来更加方便,比如要修改底部icon中的字体,直接在自定义控件的layout中修改就可以。 3、提高代码的可阅读性。

2016-04-08

android ContentResolver的使用(获取和修改联系人信息demo)

ContentProvider和ContentResolver永远是相对的,本章主要是讲ContentResolver的使用,当然是在android系统提供ContentProvider的情况下。 ContentProvider与ContentResolver概念上的东西的就不讲了,主要讲一下ContentResolver的作用以及使用方法。 ContentResolver的作用: 1、可以通过ContentResolver来获取android内部的数据,比如联系人信息、系统的多媒体信息、短信信息等等。 2、可以获取提供了ContentProvider的应用的数据。 ContentResolver的使用方法:(参考《疯狂Android讲义第三版》446面) 1、调用Context的getContentResolver()获取ContentResolver对象。 2、根据需要调用ContentResolver的insert(),delete(),updata(),query方法操作数据库。 3、为了操作系统提供的ContentResolver,需要了解该ContentProvider的Uri,以及该ContentProvider所操作的数据列的列名,可以通过查阅Android官方文档来获取这些信息。 笔者个人意见: 1、建议新手读者在学完SqLite之后再来学习ContentResolver的内容,ContentResolver的insert(),delete(),updata(),query四个操作数据库的方法均与SQLite中的相同。 2、ContentProvider的Uri,以及该ContentProvider所操作的数据列的列名都不需要死记硬背,需要用的时候查阅一下即可,新手此处最好能自己全部写一下,对ContentResolver的使用有一个总体的了解。

2016-04-07

android canvas\paint\path简单使用(自定义view必学)

最近学到自定义view,也是涉及到了canvas、paint、path的使用,此内容比较简单。 此三者一般会在自定义view的onDraw()中用到: canvas:决定view的布局(位置,画布颜色,形状) paint:决定view的属性(颜色,字体大小,风格) path:路径(path的用法深入比较复杂,此处由于是入门,就不多加阐述混淆新手了)

2016-04-01

android 滑动删除的listview(自定义view)

本篇文章算是对郭霖前辈的一篇文章的详述: 一方面是笔者自己尝试从demo中理解了一下自定义view,另一方面是笔者希望通过更详细的注释已经解说,能帮助新手更容易地理解自定义view的使用。

2016-03-29

android Fragment与Activity交互,互相发数据(附图详解)

笔者近期看官方training,发现了很多有用又好玩的知识。其中,fragment与Activity通信就是一个。 fragment与Activity通信主要是两点: 1、fragment传递信息给Activity 此点是通过在fragment中定义接口与Activity共享数据。 2、Activity传递信息给fragment 此点主要是通过fragment的getArgument()和setArgument()两个函数传递bundle来传递。

2016-03-26

android Fragment与Activity互相发数据(附图详解)

笔者近期看官方training,发现了很多有用又好玩的知识。其中,fragment与Activity通信就是一个。 fragment与Activity通信主要是两点: 1、fragment传递信息给Activity 此点是通过在fragment中定义接口与Activity共享数据。 2、Activity传递信息给fragment 此点主要是通过fragment的getArgument()和setArgument()两个函数传递bundle来传递。

2016-03-25

android Activity的启动模式 作用简析+demo详解

笔者近期做的一个项目用到了Activity的启动模式,也算是第一次深刻地领会到了其强大与方便。在此也是将自己所得与大家分享,自己写了一个比较简易的demo,便于让大家理解。 此篇博客意在让对启动模式不了解的开发者对其有一个较为形象的认识,至于深入探究,笔者还是推荐去看任玉刚前辈所写的《android开发艺术探索》了。 网上对Activity的启动模式讲解的博客有很多,但是大部分都需要掌握“栈”的知识,而且很多并不是那么通俗易懂。笔者打算独辟蹊径,一方面通过百度地图讲其作用,另一方面通过自己写的demo演示来讲解4种启动模式。

2016-03-19

学生宿舍管理系统 学生宿舍管理系统

【题目】学生宿舍管理系统 考查点:线性结构、文件操作 注意:必须使用文件存储数据,不得使用数据库管理系统。 任务:通过此系统可以实现如下功能: 录入: 可以录入宿舍情况,包括宿舍号、可容纳学生数、已容纳学生数、男生/女生宿舍等信息; 可以录入学生住宿情况,包括学号、姓名、性别、宿舍号等信息。 其他信息可以自行设计。 分配宿舍:为每一个学生分配入一个未住满的宿舍。能否提供一个智能分配算法?推荐选择?批量分配?鼓励创新。 调换宿舍:实现一个学生调换宿舍操作以及两个同性学生互换宿

2016-03-04

C++ 中文API文档

C++ 中文API文档

2016-03-04

android nextFocus使用详解

近期在学习android官方sample,学习到nextFocus的时候花了一些时间,并且也是觉得比较有用,所以拿出来分享。 效果:

2016-02-26

Android单元测试-对Activity的测试 [

前提概要 上一篇文章已经介绍了单元测试的作用和简单示例,如果不了解的读者可以先阅读上一篇 Android单元测试-作用以及简单示例。 这篇文章主要介绍常见的Activity中的测试。 对Acitivity的测试(源码在文章结尾) 对于Activity,我们大致有两种测试需求: 1、在Activity正常启动后,查看界面布局是否正确,包括View的点击事件等是否正确。 2、需要在Activity启动前完成各种数据的部署,然后查看Activity的效果。 对于这两种需求,笔者分别做了两个示例解说: 1、检测一个布局中的button和TextView是否正确。 2、从网络动态获取String到Activity界面显示,并且这个图片的URL是由Intent传递过来的。

2017-08-15

Android单元测试-对Activity的测试

#前提概要 上一篇文章已经介绍了单元测试的作用和简单示例,如果不了解的读者可以先阅读上一篇[ Android单元测试-作用以及简单示例](http://blog.csdn.net/double2hao/article/details/77159380)。 这篇文章主要介绍常见的Activity中的测试。 #对Acitivity的测试 对于Activity,我们大致有两种测试需求: 1、在Activity正常启动后,查看界面布局是否正确,包括View的点击事件等是否正确。 2、需要在Activity启动前完成各种数据的部署,然后查看Activity的效果。 对于这两种需求,笔者分别做了两个示例

2017-08-14

ListView异步创建View

异步创建View这种操作一般情况下是用不到的,包括笔者之前自学阶段也是闻所未闻。 这定然是突破了我们一般编程的思维——UI操作难道不是只能在UI线程中吗? 是的,UI操作只能在UI线程中,但是UI控件的操作却是可以异步执行的。 考虑一下以下需求: > 我们要展示一个ListView,ListView中的数据和布局都是我们网络获取的,我们预先并不知道。 以往的我们使用一个Listview一般都是为了展示一类布局相同的信息,这种情况下,我们可以通过adapter的getView()方法中的convertView来实现View的复用,使View不用反复创建。

2017-07-14

FragmentTransaction使用全解

#前言 之前已经写过用Fragment做主界面以及Fragment与Activity通信的文章。两篇文章如下: [ndroid viewpager+fragment做主界面(超容易理解的demo!)](http://blog.csdn.net/double2hao/article/details/50450377) [android Fragment与Activity交互,互相发数据(附图详解)](http://blog.csdn.net/double2hao/article/details/50983820) 对于Fragment还剩FragmentTransaction没有具体讲到,此篇文章就讲一下FragmentTransaction的主要用法,也是对之前的回顾。

2017-03-03

用Scroller完成一个简单的ViewPager

#涉及知识点 ##onMeasure和onLayout 此点若不了解可以参考郭霖前辈的文章: [ Android视图绘制流程完全解析,带你一步步深入了解View(二)](http://blog.csdn.net/guolin_blog/article/details/16330267) ##事件分发机制 此点可以参考笔者文章: [完全理解android事件分发机制](http://blog.csdn.net/double2hao/article/details/54374861) ##scrollTo和scrollBy **scrollTo:**以View的初始位置为起点进行移动 **scrollBy:**以View的当前位置为起点进行移动 ##TouchSlop 系统可以识别出的被认为是滑动的最小距离。如果大于这个距离则是滑动。 ##View.getScrollX() getScrollX()获取到的值是屏幕的最左侧在整个空间中所占位置的X值。 打个比方:View是一条6米的绳子,而屏幕只能看到2~4米的绳子。那么getScrollX()的值就为2。如果屏幕看到的是3~5米的绳子,那么getScrollX()的值就为3。 ##Scroller Scroller的使用主要为3步: 1、初始化Scroller 2、重写computeScroll()方法 computeScroll()是在View的draw的时候调用的,而invalidate会导致View重绘,所以在重写computeScroll()之后,我们要使用invalidate()来间接调用它。 过程为:invalidate()->draw()->computeScroll() 3、使用startScroll()开启滑动

2017-02-23

完全理解android事件分发机制

#前言 之前笔者其实已经写过事件分发机制的文章:[快速理解android事件传递拦截机制概念](http://blog.csdn.net/double2hao/article/details/51541061) 但是,现在看来其实更像是一篇知识概括,多出可能未讲清楚,于是打算重写事件分发,用一篇文章大致讲清楚。 首先,形式上笔者最先思考的是使用源码,此者能从原理上讲解分发机制,比起侃侃而谈好得多。但是源码的复杂往往会让新手产生畏惧难以理解,于是笔者最终还是打算使用实例log来让读者理解android事件分发。 #重要函数 笔者此次主要提及最常用的几个函数: (其间区别看源码很容易理解,此处直接给上结果) **onClick():**这个函数是是View提供给我们的OnClickListener这个接口中的函数,在这里可以自定义对点击事件的处理逻辑。会在onTouchEvent()中进行调用。 **onTouch():**这个函数是View提供给我们的OnTouchListener这个接口中的函数,在这里面可以自定义对触摸事件的处理逻辑。 **onTouchEvent():**这个函数是view内部的触摸事件的处理方式,其间包括获取焦点,调用onClick()等等。 **dispatchTouchEvent():**这个是View的事件分发函数,在ViewGroup中进行重写。在View中其间会调用onTouchEvent(),在ViewGroup中其间会调用onInterceptTouchEvent()和onTouchEvent()。 **onInterceptTouchEvent():**这个函数是事件拦截函数,是ViewGroup才有的函数。

2017-01-12

ASP.NET 电影票信息的增删查改

##题目 1、使用Code First技术创建一个Movie数据模型。 ``` public class Movie { public int ID { get; set; } //电影编号 public string Title { get; set; } //电影名称 public DateTime ReleaseDate { get; set; } //上映时间 public string Genre { get; set; } //电影类型 public decimal Price { get; set; } //电影票价 public string Rating { get; set; } //电影分级 } ``` 2、使用MVC相关技术实现数据的列表显示和新增功能。 3、完成数据的编辑、删除、明细和条件查询等功能。 4、完成如下查询: (1)查询尚未上映电影的信息 (4)查询票价在某个区间的电影信息

2016-12-14

ASP.NET 个人信息注册页面,并跳转显示

#题目 新建一个MVC项目,利用HTML、CSS、JS、jQuery、Ajax、jQuery UI等技术设计一个个人信息注册页面。当点击“提交”按钮时,跳转到新的页面显示录入信息。 **基本要求:** 用户名为6-10个小写字母(小写使用正则式验证,且用户名不能为“wustzz” –用Ajax技术来检测);密码为6位数字,确认密码不一致时有提示;籍贯使用级联(jquery实现);Email必须符合Email格式;手机是11位(假设规定以1569开头);出生年月使用jQuery UI日历组件设置;图片要传递到新的页面显示。

2016-11-23

android socket聊天室——也不仅仅是聊天室

#前提概要 笔者很久之前其实就已经学习过了socket,当然也是用socket做过了聊天室,但是觉得此知识点比较一般,并无特别难的技术点,于是也并未深究。 然而近期一个项目中对socket的使用却让笔者感觉socket强大无比,可以实现诸多功能。 #个人Socket体验 项目主要有关智能家居,需要实现多台手机同时对灯进行操作(开或者关),主要需要实现以下几点: 1、进入界面时获取所有灯的状态。 2、一台手机改变了灯的状态,其他的手机上可以有所显示。 3、硬件上改变了灯的状态(手动开关灯),所有手机上要有所显示。 此功能如果使用HTTP读取的方式实现就不太合适了。一方面客户端与服务器读取文件的同步性难以保证,即使保证了,也需要浪费大量性能;另一方面,类似笔者的这种项目功能服务器和客户端交互比较频繁,对“即时性”要求也比较高,用HTTP不仅性能消耗太大,而且难以保证“即时性”。 但是使用Socket就很容易实现了,主要逻辑如下: 1、每次进入界面与服务器建立Socket连接,并得到此时灯的状态 2、每次需要对灯进行操作的时候建立一个线程把灯的状态传递给服务器,服务器接收到之后,把该状态传递给每一个此时与服务器建立连接的客户端。

2016-11-21

android 实现FlowLayout 流线布局(自定义ViewGroup)

#项目目的 1、深化自定义View的概念 2、将MeasureSpec、View的绘制流程、Layoutparams等分散的知识点整合成一个demo。 #项目灵感 笔者经验也是有限,此文章主要借鉴张鸿洋前辈的博客。 原文地址:http://blog.csdn.net/lmj623565791/article/details/38352503 #项目预览 ![这里写图片描述](http://img.blog.csdn.net/20161018184251886) #主要涉及知识点以及相关链接 ###1、MeasureSpec [快速理解android View的测量onMeasure()与Mea

2016-10-18

为RecyclerView添加分页加载(上拉加载更多)功能

上一篇文章已经介绍了如何为RecyclerView添加FootView,在此基础上,要添加分页加载的功能其实已经很简单了。 上一篇文章地址:[为RecyclerView添加FootView和HeadView](http://blog.csdn.net/double2hao/article/details/52787975)

2016-10-11

为RecyclerView添加FootView和HeadView

上一篇文章已经介绍过了RecyclerView的基本使用方法,原文如下:[android RecyclerView布局真的只是那么简单!](http://blog.csdn.net/double2hao/article/details/51177594)此篇文章算是对RecyclerView更深使用的介绍。 FootView和HeadView在ListView中的本身就有相对应的函数,但是在新潮的RecyclerView中却没有了,FootView在分页加载(上拉在家更多)中起着很重要的作用,因此也必须要学习一下了。(HeadView的添加与FootView的添加相比大致一样,在此就只讲FootView的添加了)

2016-10-11

学生信息管理系统2222

#设计目的 1、网上很少有关于SQLite简单综合项目的测试APP。 2、把自己所学的部分UI综合一下,希望能给新手一些帮助。 #涉及知识点 1、包括SQLite的增删查找等功能。 2、RecyclerView展示 3、SharedPreference保存密码,以及判别是否是第一次安装APP。(如果是第一次就录入测试数据) 4、简单的Menu操作

2016-09-23

最简易的网络框架封装(新手可看)

网络通信在Android上的重要性就不多说了。 demo就是获取到“https://www.baidu.com/”的HTML代码后显示在textview中。 如果仅仅实现这个功能需要的java代码绝对在10行以下,但是本片主要是讲一下简易框架的封装。 封装目的: 1、在同一个项目中,我们要执行网络操作可定不想要每次都编写一遍HTTP请求的代码。通常情况我们都会将这些网络操作提取到一个公共的类里面,并提供一个静态方法,

2016-09-07

从零开始写一个简单的ImageLoader框架

从零开始写一个简单的ImageLoader框架

2016-08-12

给自定义View添加xml属性

笔者之前已经写过了一些自定义View的文章,在此对其也就不从头说起了,如有兴趣的读者可以看一下笔者的前两篇文章。 [android 自定义view的使用(最佳demo——返回标题栏)](http://blog.csdn.net/double2hao/article/details/50209249) [android 自定义控件(底部icon点击效果)](http://blog.csdn.net/double2hao/article/details/51093896) 笔者之前的文章中仅仅介绍了如何使用自定义View以及为什么要使用自定义View等等,但是在实际操作中,我们还是希望自定义View之后,直接能够在xml中就对其进行操作,如下图:

2016-08-04

快速入门android AIDL(开启多进程并进行通信)

为何要开启多进程?主要有两种情况: 一、一个应用由于自身需要采用多进程模式来实现。比如播放器之类,如果仅仅在service中运行会影响主线程的响应速度,很可能会造成ANR;如果仅仅在子线程中运行,一旦开启该线程的Activity被杀死后,线程也被杀死,无法实现后台运行效果,更加不合理。而如果在另外一个进程中使用service后台运行,就显得十分恰当了。 二、由于android对单个应用所使用的最大内存做了限制,为了加大一个应用可使用的内存,所以通过多进程来获取多份内存空间。 本篇文章demo重点: 1、开启多进程 2、两个进程之间使用AIDL进行通信

2016-06-10

RecyclerView超简单demo(局部更新取代ListView)

回顾上一篇写RecyclerView的博客(android RecyclerView布局真的只是那么简单!)。笔者比较具体地讲了一下自己对RecyclerView的理解,但是可能知识点比较杂乱,部分新手读者还是无法领会其意。正好笔者最近学习到“局部更新”的知识点,在此就再附上一个更简单的demo了。 为何要实现局部更新? 很简单,就是要提高效率。很多时候在一个列表中,我们只会修改一条item,如果直接使用notifyDataSetChanged(),未免显得有点浪费资源了。 如何实现的局部更新? 在RecyclerView出来之前,ListView如果要实现局部更新,首先要自定义一个ViewHolder,其次要自己写一个局部更新的函数。整体的流程算不上复杂,但是确实不是很方便,开发者们都会不由得想,为什么不直接官方就把这个写好啊。(ListView局部更新的例子在网上有很多,笔者在此处就不多加阐述了。) 然而,RecyclerView的出现就是帮了开发者们一个大忙了,RecyclerView.Adapter自带局部更新的函数,不需要自己写。

2016-06-08

实验五 迭代法解线性方程组与非线性方程(android)1

实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验三博客地址:http://blog.csdn.net/double2hao/article/details/51344145 实验四博客地址:http://blog.csdn.net/double2hao/article/details/51372731 【实验内容】 分别写出高斯-赛德尔迭代法与牛顿迭代法的算法,编写程序上机调试出结果,要求所编程序适用于任何一个方程的求根,即能解决这一类问题,而不是某一个问题。 1、高斯-赛德尔迭代法求解线性方程组 [ 7 2 1 -2][x1] [ 4] [ 9 15 3 -2][x2] [ 7] [-2 -2 11 5][x3]=[-1] [1 3 2 13][x4] [ 0] 2、用牛顿迭代法求方程x^3-x-1=0的近似根,精确度<=0.00001,牛顿法的初始值为1.

2016-05-25

实验五 迭代法解线性方程组与非线性方程(android)

实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验三博客地址:http://blog.csdn.net/double2hao/article/details/51344145 实验四博客地址:http://blog.csdn.net/double2hao/article/details/51372731 【实验内容】 分别写出高斯-赛德尔迭代法与牛顿迭代法的算法,编写程序上机调试出结果,要求所编程序适用于任何一个方程的求根,即能解决这一类问题,而不是某一个问题。 1、高斯-赛德尔迭代法求解线性方程组 [ 7 2 1 -2][x1] [ 4] [ 9 15 3 -2][x2] [ 7] [-2 -2 11 5][x3]=[-1] [1 3 2 13][x4] [ 0] 2、用牛顿迭代法求方程x^3-x-1=0的近似根,精确度<=0.00001,牛顿法的初始值为1.

2016-05-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除