标签: UI界面

阿木木 | 2022-12-30 | UI界面Android

Android中RecyclerView 自动滑动到底部的代码设置

今天在写聊天记录页面,RecyclerView 来做聊天记录列表展示。当用户发送消息后,如何让RecyclerView滑到最底部? 复制代码即可 js LinearLayoutManager linearLayoutManager=new LinearLayoutManager(mContext); linearLayoutManager.setStackFromEnd(true); linearLayoutManager.scrollToPositionWithOffset(imMsgItemAdapter.getItemCount()-1,Integer.MIN_VALUE); recyclerview.setLayoutManager(linearLayoutManager);

 445 |  0 |  0 UI界面Android

阿木木 | 2022-12-13 | 安卓优化特效UI界面Android

Android实现TextView显示内容关键字变颜色的方法

一、字符串关键字变色 在界面显示的时候,偶尔需要将某些字符串中特定的字符串重点标出 如下图所示: ![9ec16a9962f84e3d80feeddc4fc1ac46](https://qiniu.qjos.cn/9ec16a9962f84e3d80feeddc4fc1ac46.png) 便有了下面的方法。这个方法针对于比较 固定的字符串 ,并且需要自己 计算 需要变色的文字 位置 ,代码如下: js public static CharSequence setColor(Context context, String text, String text1, String text2) { SpannableStringBuilder style = new SpannableStringBuilder(text); // 关键字“孤舟”变色,0-text1.length() style.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorPrimary)), 0, text1.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 关键字“寒江雪”变色,text1.length() + 6-text1.length() + 6 + text2.length() style.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorAccent)), text1.length() + 6, text1.length() + 6 + text2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return style; } 二、搜索关键字变色 要使搜索关键字变色,只需要对比关键字是否和字符串之间的某些字相同,然后将相同的字改变颜色就行了。 首先说一下 如何判断一个字符串包含另一个字符串 ,有两种方法: 1. string.indexOf("xxx"); ——这个方法用于查找关键字的位置,返回一个int值,没找到则返回-1;

 303 |  0 |  0 安卓优化特效

阿木木 | 2022-12-07 | 安卓优化特效UI界面Android

Android基于搞得地图实现多个目的地路径规划并在地图展示

实现效果: ![7354013950ee485c96769d5d4d2c1b5c](https://qiniu.qjos.cn/7354013950ee485c96769d5d4d2c1b5c.gif) 实现步骤 1、下载高德路径规划案例源码 这个案例是基于高德的路径规划案例写的,高德路径规划案例源码地址: https://github.com/amap-demo/android-ride-route-plan 2、去掉案例部分功能 我将用于绘制路径的RideRouteOverlay中的添加路径点和添加起始结束点的代码给去掉了,后面我们将会自定义根据需要添加Mark点。 ![a0c439d0fcab48909be74624990fdf93](https://qiniu.qjos.cn/a0c439d0fcab48909be74624990fdf93.png) 3、增加定位功能 为了显示我们当前的位置,我们需要进行定位获取,这里的定位代码中有一些其他功能的代码,我会在下面进行说明 js //开始定位 private void initLocation() {//1 定位 2 定位+开始服务 aMap.clear(); AMapLocationClient mLocationClient = new AMapLocationClient(this); AMapLocationClientOption option = new AMapLocationClientOption(); option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); option.setOnceLocation(true); mLocationClient.setLocationOption(option); mLocationClient.setLocationListener(new AMapLocationListener() { @Override pub

 476 |  1 |  0 安卓优化特效

阿木木 | 2022-12-01 | 特效UI界面Android

Android 实现”哀悼主题“灰白模式的思路

致敬伟人,沉痛哀悼,岁月悠长,愿尘世无灾,人间无难,山河无恙。 今天我看到很多App都设置了哀悼主题的灰白模式,比如京东、淘宝等等,如图所示: ![8fcb77a286ae4f28b759ff70cfaf22b2](https://qiniu.qjos.cn/8fcb77a286ae4f28b759ff70cfaf22b2.png) 实现的效果图: ![0d3e7f04c79c4283b0adba02feb969ef](https://qiniu.qjos.cn/0d3e7f04c79c4283b0adba02feb969ef.gif) 那我们今天就介绍三种方案全局设置灰白模式: 方案一: 这也是我回复这位童鞋的方案:给Activity的顶层View设置置灰,实现全局置灰效果,下面我们来看看具体的实现过程。 可以在BaseActivity的onCreate方法中,使用ColorMatrix设置灰度 js @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //方案一 Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0);//灰度效果 paint.setColorFilter(new ColorMatrixColorFilter(cm)); getWindow().getDecorView().setLayerType(View.LAYER_TYPE_HARDWARE,paint); } 这样就可以实现啦,这种方式还是比较简单的。 方案二: 该方法使用自定义layout,在dispatchdraw方法的时候,添加一层黑白色的bitmap,让界面开起来成为黑白模式。但是缺点明显,应用比较卡顿。 1、首先需要先定义一个GrayFrameLayout布局

 672 |  0 |  0 特效UI界面

阿木木 | 2022-11-29 | UI界面Android

Android 5.0 新特性之CardView的基本使用

Android 5.0 版本中新增了CardView,CardView继承自FrameLayout类,并且可以设置圆角和阴影,使得控件具有立体性,也可以包含其他的布局容器和控件。 1.配置build.gradle 如果SDK低于5.0,我们仍旧要引入v7包。在build.gradle 中加入如下代码已自动导入 support-v7包。记得配置完再重新Build一下工程。 js compile 'com.android.support:appcompat-v7:22.2.1‘ compile 'com.android.support:cardview-v7:22.1.0' 2.使用CardView实现如下效果: ![eaac5be997d34b448b7b47d0511651de](https://qiniu.qjos.cn/eaac5be997d34b448b7b47d0511651de.jpeg) 布局如下: js <?xml version="1.0" encoding="utf-8"? <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="250dp" android:id="@+id/cv_cardview" app:cardCornerRadius="20dp" app:cardElevation="20dp" android:layout_centerInParent="

 358 |  0 |  0 UI界面Android

阿木木 | 2022-11-24 | UI界面Android

Android 关于Editext 软键盘遮挡的处理总结

前言 开发做得久了。总免不了会遇到各种坑。 而在Android开发的路上,『软键盘挡住了输入框』这个坑。可谓是一个旷日持久的巨坑——来来来。我们慢慢看。 入门篇 最主要的情况,如图所看到的:在页面底部有一个EditText。假设不做不论什么处理,那么在软键盘弹出的时候,就有可能会挡住EditText。 对于这样的情况的处理事实上非常easy。仅仅须要在 js AndroidManifest文件里对activity设置: android:windowSoftInputMode的值adjustPan或者adjustResize就可以。 像这样: js <activity android:name=".MainActivity" android:windowSoftInputMode="adjustPan" ... </activity 一般来说,他们都能够解决这个问题。当然。adjustPan跟adjustResize的效果略有差别。 adjustPan是把整个界面向上平移。使输入框露出。不会改变界面的布局; adjustResize则是又一次计算弹出软键盘之后的界面大小,相当于是用更少的界面区域去显示内容。输入框一般自然也就在内了。 难道问题就这样解决了?这仅仅是入门,基本上地球上全部的Androidproject师都能搞定。 别急,看以下 加上WebView试试看?坑来了…… 上面的入门篇中,软键盘是由原生的EditText触发弹出的。 而在H5、Hybrid差点儿已经成为App标配的时候。我们经常还会碰到的情况是:软键盘是由WebView中的网页元素所触发弹出的。 情况描写叙述 这时候,情况就会变得复杂了: 首先,页面是非全屏模式的情况下,给activity设置adjustPan会失效。 其次,页面是全屏模式的情况,adjustPan跟adjustResize都会失效。 ——解释一下。这里的全屏模式即是页面是全屏的,包含Application或activity使用了Fullscreen主题、使用了『状态色着色』、『沉浸式状态栏』、『Immersive Mode』等等——总之,基本上仅仅要是App自己接管了状态栏的控制。就会产生这样的问题。 以下这个表格

 286 |  2 |  0 UI界面Android

阿木木 | 2022-11-21 | UI界面Android

Android给SurfaceView设置圆角

复制代码即可 java mSurfaceView.setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { Rect rect = new Rect(); view.getGlobalVisibleRect(rect); int leftMargin = 0; int topMargin = 0; Rect selfRect = new Rect(leftMargin, topMargin, rect.right rect.left leftMargin, rect.bottom rect.top topMargin); outline.setRoundRect(selfRect, 22); } }); mSurfaceView.setClipToOutline(true);

 401 |  1 |  0 UI界面Android

阿木木 | 2022-10-26 | 安卓优化UI界面Android

Android完美封装的断点续传模块(含GitHub源码地址)

前言 Android端在遇到一些需要上传文件或者视频的项目时,后端一般都会要求我们进行分片上传和秒传校验。因为这样就不会上传重复的文件,也不会占用网络带宽。当然,对于我们app端来说,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。 详细教程 1、什么是秒传 通俗的说,你把要上传的东西的唯一标识(md5标识)传递给服务器,服务器识别是否存在该文件,如果存在就不需要上传,直接可获取文件信息。 2、什么是分片上传 分片上传,就是把要上传的文件切割成多个小的数据类型进行分别上传,服务器那边获取这些多个数据,再度整个成一个完整的文件。 3、什么是断点续传 一般是指,在上一次分片上传中,由于网络或者其他原因,后面几片的子数据未上传成功。在第二次上传时,可调用秒传接口,返回已上传成功的分片序号,可跳过前几片已上传的分片,直接进行未上传的分片开始上传。 封装工具类使用方式 java UploadFileUtils.with(this) .loadFile(videopath,videoname) .setBustype("mbustype") .setUpLoadListener(new UploadFileUtils.OnUpLoadListener() { @Override public void start() { showTip("上传中"); } @Override public void onUpload(int currentnum, int allnum) { showTip(String.format("%s%d%s", "上传",currentnum 100 / allnum, "%")); } @Ov

 307 |  0 |  0 安卓优化UI界面

阿木木 | 2022-10-26 | UI界面Android

Android推荐一款高大上的第三方Tag标签库

前言 在应用中可能须要设置一些标签来方便用户去查询/搜索某些信息,比方手机助手或者购物软件之类都会有一些标签。对于软件开发者来说,如何自适应一行所占用的空间尤其关键。通常使用TextView或者Button能够有限的实现相应的效果,但是并不理想。比如不能控制换行、内容重叠等。接下来给大家带来一款兼容性强,实现灵活的Android控件:FlexTags 基础效果 ![66cb6659726a4fe0ba9dd84b8210abe0](https://qiniu.qjos.cn/66cb6659726a4fe0ba9dd84b8210abe0.jpeg) 使用方式 在工程根目录的build.gradle中添加: js allprojects { repositories { maven { url 'https://www.jitpack.io' } ... } } 添加依赖: js implementation 'com.github.chockqiu:FlexTags:1.1' 在xml中添加布局: js <com.chockqiu.libflextags.view.FlexTags android:id="@+id/flex_tags" android:layout_width="match_parent" android:layout_height="wrap_content" app:flexDirection="row" app:flexWrap="wrap" app:justifyContent="flex_start" / 设置适配器: js FlexTags mFlexTags = findViewById(R.id.flex_tags); mLayoutInflater = LayoutInflater.from(this); FlexTags.Adapter mAdapter = new FlexTags.Adapter() { @Override public View onCreateView(ViewGroup parent) { r

 278 |  0 |  0 UI界面Android

阿木木 | 2022-10-20 | UI界面Android

Android在界面切换时实现共享动画效果

最近看到一个项目上的界面切换时的过渡效果很炫,决定实现一下,先放上效果图: ![5391f48df6e4453298adafafe28cebc2](https://qiniu.qjos.cn/5391f48df6e4453298adafafe28cebc2.gif) 效果就是在跳转到另一个Activity时 控件并没有消失,而是直接位移到指定位置,这个过渡效果就非常的自然,这就是”共享动画”。废话不多说,来看实现步骤 这边分为两个界面:MainActivity 和 ActivityDetails,从 MainActivity 跳转到 ActivityDetails 首先来说 MainActivity: 这边的列表我是用的 RecyclerView 来实现的,用RecyclerView来显示数据这个太简单就不用说了吧,注意,这里有个不同的地方在于在列表的 Item 布局文件中 还要稍微加一点东西 js <?xml version="1.0" encoding="utf-8"? <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp" ![7bfcbf9bf7994c90805ab45fff593343](https://qiniu.qjos.cn/7bfcbf9bf7994c90805ab45fff593343.gif) <LinearLayout android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="8dp" <Image

 276 |  0 |  0 UI界面Android

阿木木 | 2022-10-17 | UI界面Android

Android炫酷Logo跳动闪屏特效

分析: 在日常开发中,经常会遇到各种视觉效果,有的效果可能一眼看去会让人觉得很复杂,但是我们必须明确一点: 所有复杂动效都是可以分解成单一的基础动作,比如缩放,平移,旋转这些基础单元,然后将所有基础单元动作进行组合,就会产生让人眼前一亮的视觉动效。 首先看下下图效果: ![a017e53452be477e9e49f911ab7a40b5](https://qiniu.qjos.cn/a017e53452be477e9e49f911ab7a40b5.gif) 按照上面我们提到的思路进行分解: 1、Logo的名称LitePlayer被拆分为单个文字; 2、所有文字随机打散在屏幕各个位置; 3、中间的Logo被隐藏; 4、Logo文字从随机位置平移到页面固定位置; 5、中间的Logo图片逐渐显示,并且附带从下往上平移一小段位移; 6、Logo被打散的文字组合成名称; 7、Logo组合成名称后,有个渐变的光晕照射效果从左往右移动; 8、动画结束; 当我们把动画拆解后,就可以针对每个拆解单元去构造实现方案了。 实现: 首先我们先对logo文字动画进行实现: 1、首先对于数据来源,我们期望传入一个logo的字符串,内部将字符串拆解为单个文字数组: js // fill the text to array private void fillLogoTextArray(String logoName) { if (TextUtils.isEmpty(logoName)) { return; } if (mLogoTexts.size() 0) { mLogoTexts.clear(); } for (int i = 0; i < logoName.length(); i ) { char c = logoName.charAt(i); mLogoTexts.put(i, String.valueOf(c)); } } 2、所有文字需要随机打散在屏幕各个位置,因为涉及到坐标,我们可以在onSizeChanged中进行logo文字随机位置的初始化,同时我们构建两个集合存储每个文字被打散和组合后

 349 |  0 |  0 UI界面Android

阿木木 | 2022-10-15 | UI界面Android

Android仿小米垃圾清理成功后的显示界面

效果预览: ![05e817beb9a84311b8f06aa8bd9bc42f](https://qiniu.qjos.cn/05e817beb9a84311b8f06aa8bd9bc42f.gif) 实现思路: 1、自定义view,首先利用canvas.drawArc不断的画圆弧,通过改变角度值达到从0到有的圆圈。 2、等角度达到一定值的时候,开始显示绘制正确完成的钩子。 3、开始绘制圆弧的时候,一并绘制周围的三角形,这个是随机生成,然后慢慢想最新靠拢。 4、整体绘制完成,显示提示文字。 实现流程: 1、画圆弧,并且不断加角度,让其最后绘制成一个圆。通过postInvalidateDelayed方法让圆弧不停的自我绘制,直到角度的值等于360°算绘制完毕。绘制完毕后,回调调用完成的接口。 js / 画圆弧 / private void drawArc(Canvas canvas) { RectF rectF = new RectF(); rectF.left = (getWidth() arcWidth) / 2; rectF.top = (getHeight() arcWidth) / 2; rectF.right = (getWidth() arcWidth) / 2 + arcWidth; rectF.bottom = (getHeight() arcWidth) / 2 + arcWidth; if (isDraw) { //未运行的的时候可以执行一次 if (!isDrawing) { startBezierAnimotion(); } isDrawing = true; canvas.drawArc(rectF, -90, arcAngle, false, mArcPaint); arcAngle += ARC_CREATE_ANGLE; i

 266 |  0 |  0 UI界面Android

阿木木 | 2022-10-11 | UI界面Android

Android仿网易云音乐歌单详情页特效

效果图对比: 网易云音乐App原图: ![1828dc0105ad483b913544ac47e865e0](https://qiniu.qjos.cn/1828dc0105ad483b913544ac47e865e0.gif) 模仿的效果图: ![1dfef5b05aa44158a4ef96a2dded0520](https://qiniu.qjos.cn/1dfef5b05aa44158a4ef96a2dded0520.gif) 基本布局: FrameLayout   ---- MyNestedScrollView // 为了Api23下的滑动兼容    --- LinearLayout // 内容部分  ---- RelativeLayout    --- ImageView // Toolbar后面的背景图    --- Toolbar // 标题栏 由于篇幅原因,不能做详细的介绍,这里就简单介绍实现这种效果的思路: 实现思路: 1、Activity设置自定义Shared Element切换动画 2、透明状态栏(透明Toolbar,使背景图上移) 3、Toolbar底部增加和背景一样的高斯模糊图,并上移图片(为了使背景图的底部作为Toolbar的背景) 4、上下滑动,通过NestedScrollView拿到移动的高度,同时调整Toolbar的背景图透明度 1、Activity设置自定义元素共享切换动画 大家可以发现页面跳转时图片移动的是一个曲线路径,我们可以定制View的过渡切换效果,这是Material Design中比较常见的用法,Api21以上才有效。需要在开启页面时使用: ActivityOptions.makeSceneTransitionAnimation() 其中定义共享的view和transitionName。然后在对应的Activity里创建ArcMotion对象。ArcMotion是PathMotion子类,是个曲线路径,对应代码片: js // Activity设置自定义 Shared Element切换动画 if (Build.VERSION.SDK_INT = Build.VERSION_CODES.LOLLIPOP) { //

 324 |  0 |  0 UI界面Android

阿木木 | 2022-09-27 | UI界面Android

Android自定义实现气泡显示进度功能

之前公司项目中有一个需要用气泡展示进度条进度的需求,那时候忙所以没来得及整理,这次抽空就来整理下,方便以后使用,也希望能够帮到有需要的朋友们。 效果展示: ![17918c56f508412491254ce5cc0d91e1](https://qiniu.qjos.cn/17918c56f508412491254ce5cc0d91e1.gif) 实现原理: 1、进度条部分 ![c8b2fa1b6130468d97c48a4e8f1eeddf](https://qiniu.qjos.cn/c8b2fa1b6130468d97c48a4e8f1eeddf.jpeg) 这里是先绘制一条背景用来表示剩余进度,然后利用PathMeasure的getSegment方法截取路径来实现进度的展示,而进度展示的动画效果则是通过ObjectAnimator来实现的。 2、气泡部分 ![069825832c654786b39f99462f72cc0b](https://qiniu.qjos.cn/069825832c654786b39f99462f72cc0b.jpeg) 气泡部分又可以分为三部分: (1)、三角指示标部分: 三角指示标部分位置的确认如要是利用PathMeasure的,getPosTan方法根据进度条的进度获取到直角点A所在的坐标,由于我们这里是将该三角形设置为等腰直角三角形,所以该三角形的高等于斜边的1/2因此可以推断出B点和C点的位置,进而根据直角点坐标来推算出整个三角形的位置。 (2)、矩形部分: 矩形部分的位置依然是根据三角形部分的A点(即进度终止点)的坐标来计算的 js left:B点横坐标 文字宽度 top:A点纵坐标 三角形高度 文字高度 right:B点横坐标 bottom:A点纵坐标 + 三角形高度 这只是能够实现出气泡的效果,实际上只通过这样粗略的算法,实现的气泡并不圆润,因此还需更精细的打磨,比如给矩形部分加入一定的内边距等(这些都在下面代码中会逐一实现)。 (3)、文字部分 文字部分比较简单,直接利用构建矩形的Rect的 centerX()和 centerY() 方法获取到矩形的中心点,然后将文字绘制在中心的绘制即可,当然也不要忘了将Paint的TextAlign设置为Paint.Align.CEN

 328 |  0 |  0 UI界面Android

阿木木 | 2022-09-22 | UI界面Android

Android仿阿里支付宝首页应用分类功能布局

仿支付宝的应用分类CoordinatorLayout + AppBarLayout + TabLayout + RecyclerView(嵌套RecyclerView) 录制的gif 太大了,超过10M不给上传。。。就给图片吧 ![b80a4bfab1824246a6ff4636d5f717ed](https://qiniu.qjos.cn/b80a4bfab1824246a6ff4636d5f717ed.jpeg) ![a1b3556426f14f008cb2d2b1a149a122](https://qiniu.qjos.cn/a1b3556426f14f008cb2d2b1a149a122.jpeg) 实现上述效果思路: 1、如何实现悬浮效果 js <androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent" <com.google.android.material.appbar.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" app:expanded="true" app:elevation="0dp" <TextView android:layout_width="match_parent" android:layout_height="200dp" android:text="顶部内容" android:textSize="30sp"

 337 |  0 |  0 UI界面Android