优雅的给显示超长字符串的TextView加上省略号

TextView应该是Android开发中使用频次非常高的一个基础控件。对于长文本,TextView默认的处理方案是换行显示,对于只需要单行显示的TextView加上android:singleLine="true"即可让TextView单行显示,同时如果文本超过一行自动加上省略号,但是如果UI是类似这种呢?再只使用一个控件的情况下,实现的这样的显示目前能想到的有一下几种。 计算文字行数 第一种方法思路很简单,要实现这种效果只需要在还没有进行settext方法之前就先判断一下文本是否超长,如果超过一行的长度就把第一行取出来,进行手动拼接后(第一行文本+…等X人)设置到TextView上 计算文本是否有多行 TextView自身就限制行数的API所以,判断文本有几行,这代码TextView肯定已经有了,我们打开TextView的源代码,果不其然 ··· final StaticLayout.Builder layoutBuilder = StaticLayout.Builder.obtain( text, 0, text.length(), mTempTextPaint, Math.round(availableSpace.right)); layoutBuilder.setAlignment(getLayoutAlignment()) .setLineSpacing(getLineSpacingExtra(), getLineSpacingMultiplier()) .setIncludePad(getIncludeFontPadding()) .setBreakStrategy(getBreakStrategy()) .setHyphenationFrequency(getHyphenationFrequency()) .setJustificationMode(getJustificationMode()) .setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE) .setTextDirection(getTextDirectionHeuristic()); final StaticLayout layout = layoutBuilder.build(); // Lines overflow. if (maxLines != -1 && layout.getLineCount() > maxLines) { return false; } ··· layout....

九月 22, 2018 · 1 分钟 · LengYue

Android全新支持库androidx

如果使用最新版Android Studio 创建基于API28的项目,就会发现,原来的android.support.*全部变成了androidx.*??这是什么鬼?我们来看看Google的介绍 我们正在推出一种新的软件包结构,以便更清楚哪些软件包与Android操作系统捆绑在一起,并与您的应用程序的APK一起打包。展望未来,android.*软件包层次结构将保留给随操作系统提供的Android软件包; 其他包将在新的androidx.*包层次结构中发布。 正在重构现有包以使用新层次结构。历史文物 - 那些版本为27及更早版本,并打包为android.support.*- 将继续在Google Maven上提供; 但是,所有新开发都将发生在androidx.*从1.0.0开始版本化的新打包工件中。 有关所有旧类和构建工件的完整映射到新的,请参阅AndroidX重构页面。有关AndroidX重构的更多信息, 请参阅博客文章。 版本控制更改 新工件将遵循语义版本控制,并将独立更新,而不是一次更新。重组后,可以独立更新项目中的AndroidX库。这避免了将项目中的许多支持库模块从例如一次更新26.1.0到27.0.0所有支持库模块的问题。 新项目 如果使用androidx打包的依赖项创建新项目(而不是使用Android Studio工具重构现有项目),则新项目需要针对API级别28,并且您需要将以下行添加到您的gradle.properties文件中: android.useAndroidX=true android.enableJetifier=true 简而言之,support包会继续维护,但是所有新特性都会放到androidx中,如果想使用androidx,需要API为28(IDE应该也需要最新版本),同时gradle.properties中添加 android.useAndroidX=true android.enableJetifier=true,反之不想使用设置为false即可,需要注意的是即使依赖中不添加 implementation androidx.*相关的支持库,如果gradle.properties中设置为true 仍然使用androidx相关支持库,android.support相关引用会提示not found

九月 13, 2018 · 1 分钟 · LengYue

新版本Gradle修改打包的路径和文件名

这里分为Gradle3.0之前和之后两种方法。 3.0之前 在release 下添加下面代码 applicationVariants.all { variant -> variant.outputs.each { output -> if (outputFile != null && outputFile.name.endsWith('.apk')) { def apkFile = new File( output.outputFile.getParent(), "${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk") output.outputFile = apkFile } } } 3.0之后 3.0之后不允许修改 output.outputFile 会提示报错。 applicationVariants.all { variant -> variant.outputs.all { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { def fileName = "${defaultConfig....

九月 8, 2018 · 1 分钟 · LengYue

Flutter 下一些常用的插件

库 功能 dio 网络框架 shared_preferences 本地数据缓存 fluttertoast toast flutter_redux redux device_info 设备信息 connectivity 网络链接 flutter_markdown markdown解析 json_annotation json模板 json_serializable json模板 url_launcher 启动外部浏览器 iconfont 字库图标 share 系统分享 flutter_spinkit 加载框样式 get_version 版本信息 flutter_webview_plugin 全屏的webview sqflite 数据库 flutter_statusbar 状态栏 flutter_svg svg photo_view 图片预览 flutter_slidable 侧滑

九月 4, 2018 · 1 分钟 · LengYue

Android 5.0一下分包最新解决办法

建议参照最新官方提供的分包方式 (科学上网)进行分包,具体配置方式在 multiDexKeepProguard 属性下 第一步、新建文件 app Module 下,新建一个名为multidex-config.pro的文件 文件内具体内容实例: -keep class me.passin.pmvp.app.GlobalConfiguration 即想把哪个类分在主Dex 则 -keep class 类名。 如果您想要指定包中的所有类,文件将如下所示: -keep class com.example.** { *; } 第二步、App模块的build.gradle添加配置参数 android { buildTypes{ release{ multiDexKeepProguard file('multidex-config.pro') } } }

八月 29, 2018 · 1 分钟 · LengYue

Android P 跳过Gapps开机引导

Android P跳过Gapps开机引导 Android手机在刷了Gapps之后,在开机进入系统时会进入Gapps的开机引导(也就是设置Google帐号神马的)。但是这需要连Google进行验证,于是。。。。。。。。 对于这种情况,可以通过以下方法解决: 连Google进行验证 断网 顺时针点屏幕四角 更改USER_SETUP_COMPLETE和DEVICE_PROVISIONED 连Google进行验证 这个方法就不多说了,只要能连上Google,就不会卡在这里了。至于怎么连Google,请自行寻找科学上网。 断网 这个Gapps的开机引导是需要连网进行的,默认的情况下如果不连网的情况下是会自动跳过的。但是许多系统在默认情况下Wifi和数据是会自动打开,就算把卡取了,也还会有Wifi,一样无法跳过。对此,可选择先不刷Gapps,进入系统后将Wifi的数据关闭,再刷Gapps,此方法有一定弊端,有可能会导致Gapps某些应用发生某些玄学问题。。。。。 顺时针点屏幕四角 这可能是最玄学的一个方法了,据传连点屏幕四角就可跳过此引导(顺时针方向,从左上角开始)。但是!!!但是!!!这是检验血统的时刻,时灵时不灵。别问我是怎么知道的。 (╯‵□′)╯︵┻━┻ 更改USER_SETUP_COMPLETE和DEVICE_PROVISIONED 敲黑板!!! 这是我所试过最科学的方法。在开机情况下,将手机连上电脑,使用adb工具来修改USER_SETUP_COMPLETE和DEVICE_PROVISIONED的值。具体操作如下: 打开命令行,输入命令: adb shell settings put secure user_setup_complete 1 adb shell settings put global device_provisioned 1 重启,搞定。 一般的类原生系统 ADB默认是打开的,及时没有进入系统,依旧可以通过ADB设置,手机官方系统一般ADB默认关闭的 注: 在WINDOWS下,如果未将adb.exe文件所在路径添加至环境变量中,则需要在adb.exe文件所在目录下打开命令行,而后将上述命令中的adb更改为./adb.exe。 上述命令运行错误时会有提示,而成功则没有。

八月 19, 2018 · 1 分钟 · LengYue

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....

八月 14, 2018 · 2 分钟 · LengYue

RecyclerView里notifyItemRemoved的坑

RecyclerView很多时候是展示静态的数据,并不会有删除的操作,讲到RecyclerView时,会提到它提供了一个很好的展现删除操作动画的函数,代码片段一般是这样的 @Override public void onBindViewHolder(final CommonViewHolder holder, final int position) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { contentList.remove(position); notifyItemRemoved(position); } }); } 这样写的话,很快会产生数据删除错乱和超出索引异常导致崩溃。 原因是函数里面的传入的参数position,它是在进行onBind操作时确定的,在删除单项后,已经出现在画面里的项不会再有调用onBind机会,这样它保留的position一直是未进行删除操作前的postion值。 对于尚未进入画面的单项来说,它会使用新的position值,这个值是正确的,如果在单项里加上下面的代码 holder.textView.setText(contentList.get(position) + "#" + String.valueOf(position)); 在删除第一屏的一项后,向上滚动,会发现新滚上来的一行和它上面的一行的textview显示是一样的。 解决办法也很简单 先remove,再notifyItemRemoved, 最后再notifyItemRangeChanged remove:把数据从list中remove掉, notifyItemRemoved:显示动画效果 notifyItemRangeChanged:对于被删掉的位置及其后range大小范围内的view进行重新onBindViewHolder

八月 14, 2018 · 1 分钟 · LengYue