">

https://gravatar.cat.net/avatar/08cf681fb7c6ad1b4fe70a8269c2103c?s=96&d=mp&r=g

LengYue's Blog

0.0

给LengYue's Blog打分

start start start start start

感谢您打了2

详情

全站展示位

在AndroidManifest.xml文件中的android:windowSoftInputMode属性使用| keyboard,squeezing,layout |

The AndroidManifest.xml File <activity android:windowSoftInputMode=["stateUnspecified", "stateUnchanged", "stateHidden", "stateAlwaysHidden", "stateVisible", "stateAlwaysVisible", "adjustUnspecified", "adjustResize", "adjustPan"] …… > </activity> 。。。

推荐

Android清除本地数据缓存代码 |

/* 文 件 名: DataCleanManager.java 描 述: 主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清 除自定义目录 */

在AndroidManifest.xml文件中的android:windowSoftInputMode属性使用| keyboard,squeezing,layout |

The AndroidManifest.xml File <activity android:windowSoftInputMode=["stateUnspecified", "stateUnchanged", "stateHidden", "stateAlwaysHidden", "stateVisible", "stateAlwaysVisible", "adjustUnspecified", "adjustResize", "adjustPan"] …… > </activity>

搭建为知笔记Docker版,以及注意事项 |

好久没有关注为知笔记了,最近考虑迁移笔记的时候,看了一下各大笔记应用,开源笔记要么不支持全平台,要么客户端完善度或者同步问题不行。突然发现为知笔记支持docker版,可以自己部署,客户端还是使用官方客户端。 安装docker docker version > /dev/null || curl -fsSL get.docker.com | bash service docker restart 启动为知笔记docker 创建文件夹,跟官方保持一致,我们也在主目录创建文件 cd ~ mkdir wizdata 启动,如果你打算使用nginx,或者配置ssl,则需要把端口调整一下。比如我的6789 docker run --name wiz --restart=always -it -d -v ~/wizdata:/wiz/storage -v /etc/localtime:/etc/localtime -p 80:80 -p 9269:9269/udp wiznote/wizserver 接下来会自动下载并运行,喝杯咖啡,等一下就可以了。 或者,可以在这个时候配置Nginx 配置Nginx 开启SSL ssl_certificate XXX/fullchain.pem; #你的证书地址 ssl_certificate_key XXX/privkey.pem; #你的证书地址 ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5:!EXP; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; error_page 497 配置云存储 默认笔记是保存在本地的,你可以使用本地+云同步的方式,或者像我一样直接使用云储存, 配置阿里OSS

IOS的专利?Android也能流畅实现毛玻璃效果效果 |

背景介绍 上图就是我们在IOS设备上经常能够见到的毛玻璃(高斯模糊)效果。不得不说,这种效果在适合的场景下使用,能够获得绝佳的美感。但是鉴于Android设备性能和兼容性问题,我们通常很难在Android设备上见到这种效果。 但这并不是IOS的专利效果,Android也能轻松流畅的实现。本篇文章将会详细的讲解如何实现。 Android中的高斯模糊 我为什么选择RenderScript实现高斯模糊 目前Android设备上实现高斯模糊效果的方式通常有: 云端处理,移动客户端直接从网络获取处理好的图片。这种方式局限性很大。 FastBlur等开源库。这种方式兼容性不错,但是效率极低。 c实现。不懂c的理解困难。 OpenGL实现。效果很好,但电量和内存消耗比较高。 RenderScript实现。效果略弱于第4种,但是使用方便,速度很快,性能消耗在可接受范围内,加上Google的兼容性解决方案,可以说是能够作为优先考虑的方式。 RenderScript RenderScript主要在android中的对图形进行处理,RenderScript采用C99语法进行编写,主要优势在于性能较高。在Api11的时候被加入到Android中。同时,Google提供了android.support.v8.renderscript兼容包,能够实现更低版本的兼容。 RenderScript提供了一个用于实现高斯模糊的封装类ScriptIntrinsicBlur ,这货在Api17才被收编Android所以在不使用兼容包的情况下只能兼容到4.2的设备。但是,我们有兼容包啊向下兼容不是梦。 准备阶段 ###引入兼容包 方法很简单,只需在build.gradle中加入: defaultConfig { 。 。 。 //就是这么简单 renderscriptTargetApi 19 renderscriptSupportModeEnabled true } 你以为这样就好了?nonono。 由于一些坑人的厂商会深度定制Android系统,所以一些必要的依赖文件会被它们直接去掉!!这导致一些型号的设备上调用RenderScriptd的部分方法时会报错。所以我们得加上这些可能丢失的文件。 其实也简单,打开android_sdk/build-tools/选择19以上版本/renderscript/lib/packaged我们可以看见3个包含.os文件的文件夹。 直接复制这三个文件加到项目工程的jniLibs 包下。什么?找不见jniLibs包?自己建一个喽。 注意,这时候,我们很可能遇到一个崩溃,找不到.os文件。莫慌莫慌… 在build.gradle的android{}中加入: sourceSets { main { jniLibs.srcDirs = ['libs'] } } 没完没了!最后一步只针对使用的混淆的同学,需要在混淆中加入: -keep class android.support.v8.renderscript.** { *; } 实现高斯模糊 终于可以开始写代码了。先来看看效果。下图高斯模糊半径逐渐增大的效果,请忽略渣渣录屏效果 将ScriptIntrinsicBlur封装成工具类。咱们代码里接着款 import android.support.v8.renderscript.*; //这句很重要啊,v8包的,不然不能向下兼容啊。 public class RenderScriptGaussianBlur { private RenderScript rs; public RenderScriptGaussianBlur(Context context) { // 创建RenderScript内核对象 this.

心灵鸡汤

小故事、钢玻璃杯的故事

  一个农民,初中只读了两年,家里就没钱继续供他上学了。他辍学回家,帮父亲耕种三亩薄田。在他19岁时,父亲去世了,家庭的重担全部压在了他的肩上。他要照顾身体不好的母亲,还有一位瘫痪在床的祖母。

  八十年代,农田承包到户。他把一块水洼挖成池塘,想养鱼。但乡里的干部告诉他,水田不能养鱼,只能种庄稼,他只好有把水塘填平。这件事成了一个笑话,在别人的眼里,他是一个想发财但有非常愚蠢的人。

  听说养鸡能赚钱,他向亲戚借了500元钱,养起了鸡。但是一场洪水后,鸡得了鸡瘟,几天内全部死光。500元对别人来说可能不算什么,对一个只靠三亩薄田生活的家庭而言,不啻天文数字。他的母亲手不了这个刺激,竟然忧郁而死。

  他后来酿过酒,捕过鱼,甚至还在石矿的悬崖上帮人打过炮眼……可都没有赚到钱。

  35岁的时候,他还没有娶到媳妇。即使是离异的有孩子的女人也看不上他。因为他只有一间土屋,随时有可能在一场大雨后倒塌。娶不上老婆的男人,在农村是没有人看得起的。

  但他还想搏一搏,就四处借钱买一辆受扶拖拉机。不料,上路不到半个月,这辆拖拉机就载着他冲入一条河里。他断了一条腿,成了瘸子。而那拖拉机,被人捞起来,已经支离破碎,他只能拆开它,当作废铁卖。

  几乎所有的人都说他这辈子完了。

  但是后来他却成了我所在的这个城市里的一家公司的老总,手中有两亿元的资产。现在,许多人都知道他苦难的过去和富有传奇色彩的创业经历。许多媒体采访过他,许多报告文学描述过他。但我只记得这样一个情节--

  记者问他:"在苦难的日子里,你凭什么一次又一次毫不退缩?"

  他坐在宽大豪华的老板台后面,喝完了手里的一杯水。然后,他把玻璃杯子握在手里,反问记者:"如果我松手,这只杯子会怎样?"

  记者说:"摔在地上,碎了。"

  "那我们试试看。"他说。

  他手一松,杯子掉到地上发出清脆的声音,但并没有破碎,而是完好无损。他说:"即使有10个人在场,他们都会认为这只杯子必碎无疑。但是,这只杯子不是普通的玻璃杯,而是用玻璃钢制作的。"

  于是,我记住了这段经典绝妙的对话。这样的人,即使只有一口气,他也会努力去拉住成功的手,除非上苍剥夺了他的生命……

列表展示

主站展示位

使用 GoMobile 创建 Android、iOS 跨平台 WebSocket Library |

GoMobile 是 Go 语言的扩展,将 Go 代码编译为可在移动设备上运行的静态库或动态库,可在 iOS 和 Android 平台上使用。本文介绍如何使用 GoMobile 创建 Android 应用并在其中调用 Go 语言 WebSocket。 安装 GoMobile go install golang.org/x/mobile/cmd/gomobile@latest 创建 Go WebSocket 库 首先创建一个 Go WebSocket 服务端: mkdir go-websocket cd go-websocket go mod init go-socket // 使用 gomobile 初始 gomobile init 如果你无法使用 gomobile init 请检查 GOBIN 是否加入环境变量 我们使用在go 中广泛使用的gorilla/websocket来创建websocket服务端: go get github.com/gorilla/websocket 编写WebSocket服务端代码: package socket import ( "flag" "log" "net/

软件开发 |

琥珀之月,空谷之兰,皆是孤芳,既是孤芳,但求自赏便罢!

GetX Router 设置返回值 |

通过别名导航: var result = await Get.toNamed(Routes.WEB_VIEW, arguments: { "url": item?.link ?? "", "index": index, "collect": item?.collect ?? false, }); 返回值: Get.back(result: {"collect": collect.value}); 完整代码: () async { /// 导航到新的界面 var result = await Get.toNamed(Routes.WEB_VIEW, arguments: { "url": item?.link ?? "", "index": index, "collect": item?.collect ?? false, }); /// 接收返回值 bool collect = result["collect"]; }

Android ListView 与 RecyclerView 对比浅析—缓存机制 |

一,背景 RecyclerView是谷歌官方出的一个用于大量数据展示的新控件,可以用来代替传统的ListView,更加强大和灵活。 最近,自己负责的业务,也遇到这样的一个问题,关于是否要将ListView替换为RecyclerView? 秉承着实事求是的作风,弄清楚RecyclerView是否有足够的吸引力替换掉ListView,我从性能这一角度出发,研究RecyclerView和ListView二者的缓存机制,并得到了一些较有益的”结论”,待我慢慢道来。 同时也希望能通过本文,让大家快速了解RecyclerView与ListView在缓存机制上的一些区别,在使用上也更加得心应手吧。 PS:相关知识: ListView与RecyclerView缓存机制原理大致相似,如下图所示: 过程中,离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中获取,只是ListView与RecyclerView的实现细节有差异.(这只是缓存使用的其中一个场景,还有如刷新等) PPS:本文不贴出详细代码,结合源码食用更佳! 二. 正文 2.1 缓存机制对比 层级不同: RecyclerView比ListView多两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用同一个RecyclerViewPool(缓存池)。 具体来说: ListView(两级缓存): RecyclerView(四级缓存): ListView和RecyclerView缓存机制基本一致: 1). mActiveViews和mAttachedScrap功能相似,意义在于快速重用屏幕上可见的列表项ItemView,而不需要重新createView和bindView; 2). mScrapView和mCachedViews + mReyclerViewPool功能相似,意义在于缓存离开屏幕的ItemView,目的是让即将进入屏幕的ItemView重用. 3). RecyclerView的优势在于a.mCacheViews的使用,可以做到屏幕外的列表项ItemView进入屏幕内时也无须bindView快速重用;b.mRecyclerPool可以供多个RecyclerView共同使用,在特定场景下,如viewpaper+多个列表页下有优势.客观来说,RecyclerView在特定场景下对ListView的缓存机制做了补强和完善。 缓存不同: 1). RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为: View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态); 2). ListView缓存View。 缓存不同,二者在缓存的使用上也略有差别,具体来说: ListView获取缓存的流程: RecyclerView获取缓存的流程: 1). RecyclerView中mCacheViews(屏幕外)获取缓存时,是通过匹配pos获取目标位置的缓存,这样做的好处是,当数据源数据不变的情况下,无须重新bindView: 而同样是离屏缓存,ListView从mScrapViews根据pos获取相应的缓存,但是并没有直接使用,而是重新getView(即必定会重新bindView),相关代码如下: //AbsListView源码:line2345 //通过匹配pos从mScrapView中获取缓存 final View scrapView = mRecycler.getScrapView(position); //无论是否成功都直接调用getView,导致必定会调用createView final View child = mAdapter.getView(position, scrapView, this); if (scrapView != null) { if (child != scrapView) { mRecycler.

岁月如歌 |

琥珀之月,空谷之兰,皆是孤芳,既是孤芳,但求自赏便罢!

⾃定义布局流程 |

⾃定义布局流程 布局过程 确定每个 View 的位置和尺⼨ 作⽤:为绘制和触摸范围做⽀持 绘制:知道往哪⾥绘制 触摸反馈:知道⽤户点的是哪⾥– 流程 从整体看 测量流程:从根 View 递归调⽤每⼀级⼦ View 的 measure() ⽅法,对它们进⾏测量 布局流程:从根 View 递归调⽤每⼀级⼦ View 的 layout() ⽅法,把测量过程得出的⼦ View 的位置和尺⼨传给⼦ View,⼦ View 保存 为什么要分两个流程? 从个体看,对于每个 View: 运⾏前,开发者在 xml ⽂件⾥写⼊对 View 的布局要求 layout_xxx ⽗ View 在⾃⼰的 onMeasure() 中,根据开发者在 xml 中写的对⼦ View 的要求,和⾃⼰的可⽤空间,得出对⼦ View 的具体尺⼨要求

FastJson简单使用 |

在工作中,经常客服端需要和服务端进行通信,目前很多项目都采用JSON的方式进行数据传输,简单的参数可以通过手动拼接JSON字符串,但如果请求的参数过多,采用手动拼接JSON字符串,出错率就非常大了。并且工作效率也特别低。 我在网上看了一些开源的JSON框架,比如Google提供的Gson,Jackson,FastJson等框架。 经过测试,个人觉得FastJson执行效率比较高,而且简单易用。 FastJson不依赖于第三方包, 直接可以运行在Java JDK1.5之上,FastJson完全支持 一个JSON库涉及的最基本功能就是序列化和反序列化。Fastjson支持java bean的直接序列化。使用com.alibaba.fastjson.JSON这个类进行序列化和反序列化。 简单的序列化 pubic class UserInfo implements Serializable{ private String name; private int age; public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setAge(int age){ this.age=age; } public int getAge(){ return age; } } public class TestOne{ public static void main(String[] args){ UserInfo info=new UserInfo(); info.

android 10 [API 29]适配指南 |

Android 11[API 30]已经发布正式版,来看看全新的 android 11 [api 30] 适配指南 非SDK接口 google 针对非SDK接口的限制 非SDK接口检测工具 官方给出了一个检测工具,下载地址:veridex veridex使用方法: appcompat.sh --dex-file=apk.apk blacklist、greylist、greylist-max-o、greylist-max-p含义 以上截图中,blacklist、greylist、greylist-max-o、greylist-max-p含义如下: blacklist 黑名单:禁止使用的非SDK接口,运行时直接Crash(因此必须解决) greylist 灰名单:即当前版本仍能使用的非SDK接口,但在下一版本中可能变成被限制的非SDK接口 greylist-max-o: 在targetSDK<=O中能使用,但是在targetSDK>=P中被禁止使用的非SDK接口 greylist-max-p: 在targetSDK<=P中能使用,但是在targetSDK>=Q中被禁止使用的非SDK接口 设备ID 从Android 10开始已经无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否是配过Android 10。 IMEI等设备信息 从Android10开始普通应用不再允许请求权限android.permission.READ_PHONE_STATE。而且,无论你的App是否适配过Android Q(既targetSdkVersion是否大于等于29),均无法再获取到设备IMEI等设备信息。 受影响的API Build.getSerial(); TelephonyManager.getImei(); TelephonyManager.getMeid(); TelephonyManager.getDeviceId(); TelephonyManager.getSubscriberId(); TelephonyManager.getSimSerialNumber(); targetSdkVersion<29 的应用,其在获取设备ID时,会直接返回null targetSdkVersion>=29 的应用,其在获取设备ID时,会直接跑出异常SecurityException 如果您的App希望在Android 10以下的设备中仍然获取设备IMEI等信息,可按以下方式进行适配: <uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="28" /> Mac地址随机分配 从Android10开始,默认情况下,在搭载 Android 10 或更高版本的设备上,系统会传输随机分配的 MAC 地址。(既从Android 10开始,普通应用已经无法获取设备的真正mac地址,标识设备已经无法使用mac地址) 唯一ID的替代 Google给出的解决方案是:如果您的应用有 追踪非登录用户重装 的需求,可用ANDROID_ID来标识设备。 ANDROID_ID的生成规则为:签名+设备信息+设备用户 ANDROID_ID重置规则:设备恢复出厂设置时,ANDROID_ID将被重置 String androidId = Settings.

Android声明式UI框架 Litho 初探 ——两种数据类型 |

Litho中包含的的两种数据类型 Litho的两种属性分别是: 不可变属性称为Props 可变属性称为State 不可变属性Props 定义和使用props Props属性:Component中使用@Prop注解的参数集合,具有单向性和不可变性,可以在左右的方法中访问它的指。在同一个Component中我们可以定义和访问相同的prop 下面这个例子,定义了两个Prop,一个string类型text,一个int类型index,text的注解中optional = true表示它是一个可选参数。 当Component的生命周期方法被调用的时候,@Prop参数会保存component创建时从它们的父级传递过来的值(或者它们的默认值) 设置props prop参数其实在前几篇文章中都有使用过,用起来也没有什么特别的地方,这里不在赘述,制作一个简单的说明。 Component中的prop参数会在编译时候自动加入到Builder中,以上面的代码举例: PropComponent.create(c).index(10)./*text("测试文本").*/build() Prop的默认值 对于可选的Prop如果不设置值,就是java的默认值。或者你也可以使用@PropDefault注解然后添加默认值。 如果你使用Kotlin,那还需要加上@JvmFiel把该字段编辑为public才行。 @MountSpec object PropComponentSpec { @JvmField @PropDefault val prop1 = "default" @JvmField @PropDefault val prop2 = -1 资源类型 在Android开发中,我们经常会限定参数的类型。比如: fun doSomething(@ColorInt color: Int, @StringRes str: Int, @DimenRes width: Int){} 在Compontent的Prop中也有类似的操作,具体看代码: fun onMount( c: ComponentContext, textView: TextView, @Prop(optional = true,resType = ResType.STRING) text: String?

Android Manifest之receiver元素中文注释 |

语法(SYNTAX): <receiver android:enabled=["true" | "false"] android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:process="string" > . . . </receiver>

Flutter |

琥珀之月,空谷之兰,皆是孤芳,既是孤芳,但求自赏便罢!

Don’t Store Data in the Application Object |

There is always some information that is needed in many places in your app. It can be a session token, the result of an expensive computation, etc. It is often tempting to avoid the overhead of passing objects between activities or keeping those in persistent storage. A pattern that is sometimes suggested is to dump your data in the Application object with the idea that it will be available across all activities.

Android调用手机中的应用市场 |

public static void goToMarket(Context context, String packageName) { Uri uri = Uri.parse("market://details?id=" + packageName); Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri); try { context.startActivity(goToMarket); } catch (ActivityNotFoundException e) { e.printStackTrace(); } }

Android-使用@AutoService实现spi |

什么是 SPI? Java SPI 全称 Service Provider Interface,是 Java 提供的一套用来被第三方实现或者扩展的 API,它可以用来启用框架扩展和替换组件。实际上是“基于接口的编程 + 策略模式 + 配置文件”组合实现的动态加载机制. 具体解释就是: 定义一个接口文件 写出多个该接口文件的实现 在 src/main/resources/ 下建立 /META-INF/services 目录, 新增一个以接口命名的文件 , 内容是要接口的实现类全路径 使用 ServiceLoader 类 来获取到这些实现的接口 示例 定义一个接口文件 - Book package com.apkdv.spi_test; public interface Book { String name(); } 实现两个接口 package com.apkdv.spi_test; public class Android implements Book { @Override public String name() { return "Android"; } } package com.

岁月如歌 |

琥珀之月,空谷之兰,皆是孤芳,既是孤芳,但求自赏便罢!

Flutter和原生Android控件对比 |

Flutter和原生Android控件对比: Flutter控件 Android控件 AppBar ActionBar/ToolBar ListView ListView/RecyclerView Text TextView Center ViewGroup FloatingActionButton FloatingActionButton(design库里面的) BottomNavigationBar BottomNavigation(design库里面的) RaisedButton/Button Button Column LinearLayout的android:orientation=“vertical” Row android:orientation=“horizontal” DecorationImage ImageView Image ImageView Stack FrameLayout/RelativeLayout Container RelativeLayout CustomMultiChildLayout RelativeLayout Algin alginParentXXX属性 resizeToAvoidBottomPadding android:windowSoftInputMode=”adjustResize属性 SingleChildScrollView ScrollView CustomScrollerView Recyclerview Image里面的BoxFit参数介绍:(相当于Android的ImageView的scaleType参数)

博客寄语:

    从14年开始写博客,到现在再有2年就10年了。

实时播报:

博客号-学习成长

相信每一分耕耘都有每一分收获,致力帮助博客主所创作的博客能更快的被收录! 如果有其它需求,可联系下方邮箱。