- 博客(33)
- 收藏
- 关注
原创 ArkUI自定义TabBar组件
由于指示器需要跟随内容视图一起滑动切换,所以指示器不能在单个tabBuilder中设置。1、使用Column组件定义底部指示器,设置一个宽度为文字宽度,高度为3的蓝色指示器;2、这里的指示器宽度可以动态设置成文字的宽度,也可以直接设置成文字某个固定宽度;3、指示器距离左边的距离需要动态设置,配上动画,可以实现指示器跟随手指滑动。Stack() {}.tabBar(this.tabBuilder("房源", 0, $r("app.media.trip_data_start_bg")))...
2024-10-21 14:13:25 635
原创 ArkUI自定义Scroll滑动 指示器
这里其实不是一个进度条,所以需要我们需要自定义绘制该组件,在鸿蒙中绘制组件单独使用,用于在页面上绘制指定的图形。有7种绘制类型,分别为Circle(圆形)、Ellipse(椭圆形)、Line(直线)、Polyline(折线)、Polygon(多边形)、Path(路径)、Rect(矩形),这里我么使用 Rect 进行矩形绘制,一个黑色的 Rect当做指示器的背景,蓝色当做指示器的进度。然后动态设置进度的左边距。
2024-10-21 14:09:41 323
原创 Compose和AndroidView的交互
参数主要是用来初始化AndroidView布局,将AndroidView布局通过工厂模式转换成ComposeUI加载到Compose中,只会执行一行,第二个回调函数,主要是用来更新UI数据,LiveData是JetPack组件的一部分,主要是在AndroidView中用来监听数据的变化,并且具有生命感知的,只有在Activity等处于活动才会触发数据更新。由于在AndroidView中常用LiveData来进行数据的订阅,而在Compose中使用的是Compose特有的。对象,在Compose中使用。...
2022-09-01 14:04:43 1392 1
原创 Compose实现一个带复选框的列表
像对于文本,复选框多了一个选中改变的回调,我们需要再回调中处理数据的绑定,不然点击复选框会没有反应。我们可以通过这个回调来将数据和控件进行绑定,以及处理一些业务逻辑。这里需要把这个回调抛到上一级去来处理列表数据的选中状态的更新。11~14行加载了一个复选框控件,复选框相对于其他控件会多一个选中回调,类似的还有输入框控件。的布局 ,回调函数拿到是否是选中的数据,用来更新数据源集合。3~5行代码是定义了一个变量用来存放复选框的选中状态,使用。,创建一个按钮,点击后用来展示选中几个。的布局,如果要是加载多个。..
2022-09-01 14:02:47 775
原创 JetPack Compose 底部导航栏实现
---highlight: a11y-lighttheme: scrolls-light---开发一个新项目,底部导航栏一般是首页的标配,在以前的xml布局中,我们可以很轻松的是用谷歌提供的`BottomNavigationView`或者自定义来实现底部导航的功能,在Compose中也有也提供了一个类似的控件`androidx.compose.material.BottomNavigation`。#### 1.声明导航栏数据源主要声明导航栏label和图标数组,这里使用的是本地数据,也可以使用
2021-10-11 15:46:16 1387
原创 Jetpack Compose之布局介绍
Jetpack Compose 是用于构建原生界面的新款 Android 工具包。它可简化并加快 Android 上的界面开发。使用更少的代码、强大的工具和直观的 Kotlin API,快速让应用生动而精彩。一.标准布局组件Compose中可以将多个控件元素组合使用,例如下面这样,@Composablefun WidgetGroup() { Text(text = "不为往事扰") Text(text = "余生只愿笑")}但是我们会发现,如果仅仅是这样,两个文本控件会重叠在一
2020-11-25 17:34:33 1077 1
原创 使用Activity Results API来替代onActivityResult
说到onActivityResult,我们已经非常熟悉来,通过在A activity启动B activity并且传入数据到B中,然后在A中通过onActivityResult来接收B中返回的数据。在最新的activity-ktx的beta版本中,谷歌已经废弃了onActivityResult。 @SuppressWarnings("deprecation") @Override @CallSuper protected void onActivityResult(int reque
2020-10-29 16:51:01 1534
原创 SwiftUI之NavigationView用法
NavigationView是SwiftUI应用程序最重要的组件之一,它使我们能够轻松推送和弹出屏幕,以清晰,分层的方式向用户展示信息。NavigationView一般用在页面的最外层。可以在其内部添加标题栏,页面内容,以及底部导航栏等等。我们可以很方便的使用NavigationView来为页面添加标题栏,假设这个页面内容只有一个“Hell World”,那么我们可以这样为页面中添加标题栏NavigationView { Text("Hello, World!") .naviga
2020-10-29 16:49:40 1163
原创 android中kotlin协程和线程的关系
一.子线程和主线程的频繁切换假设现在有这样的一个业务逻辑,有3个耗时操作,耗时1函数执行完毕后,我们需要调用函数1更新UI,再执行耗时2函数,执行完毕后我们在调用函数2更新UI,最后执行耗时3函数,再调用函数3更新UI。1.定义3个不同的耗时操作函数和3个更新UI的函数 fun ioCode1() { println("我是IO线程1==${Thread.currentThread().name}") } fun ioCode2() { prin
2020-09-23 17:56:00 2112
原创 Flutter项目中构建Web工程以及发布nginx服务
Flutter的beat通道已经支持对web的支持,通过 Web 支持,你可以将使用 Dart 编写的现有 Flutter 代码编译为可以嵌入浏览器,并部署到任何 Web 服务器上,具有客户端体验的 Web 应用。你可以使用 Flutter 的所有功能,而不需要任何浏览器插件。使用Flutter构建Web应用1.创建一个支持Web的新项目如果你不知道自己的FLutter的channel版本,你可以使用flutter channel命令来查看Flutter通道:caojingMBP:~ caojin
2020-09-07 17:27:23 1121
原创 Flutter学习八之滑动组件ListView和GridView的使用
今天我们用Flutter来实现这样的一个页面,类似于一个分组列表,在Android 中如果要实现一个这样的页面,实现想到的肯定是RecycleView,然后通过在adapter中设置两个item样式根据在数据中新增一个标示来区分是标题还是内容,一个控件就能搞定,但是在Flutter中并没有适配器的概念,那如果要实现这样的一个布局该怎么办?通过分析页面得知,这应该是一个ListView嵌套一个GridView来实现的,在Android中RecycleView还没出来之前,我们如果要实现这样的一个布局,常用
2020-09-03 17:04:40 1136
原创 十进制和二进制转换原理
十进制是有0到9的数字组成的,二进制则是有0,1两个数字组成,那么为什么人类的计数方式是十进制,电脑的计数方式是二进制呢,十进制和二进制的本质是什么,他们是不是有什么共同点,或者说计数方式的通用点,十进制怎么转换成二进制,他们能不能快速进行转换。1.我们来了解一下我们比较常用的十进制数,比如数字 13245 这是一个五位数,从左➡️右分别有个,十,百,千,万组成的那么可以将十进制数据转换成下面这样13245=1*10000+3*1000+2*100+4*10+5*1 =1*10⁴+2*10³+
2020-08-26 19:25:38 3921 1
原创 Flutter学习七之实现一个简单的页面基类,支持全局控制页面状态
在Android 中可以定义Activity基类,所有可以在基类定义一些公共方法,比如全局标题栏,页面跳转动画,那么子啊FLutter中是不是也可以定义一个页面的基类,今天就来尝试一下。首先我们定义一个抽象类BaseWidget,该类继承自StatefulWidget,代码如下:abstract class BaseWidget extends StatefulWidget { @override BaseWidgetState createState() => getState();
2020-08-24 22:44:17 906
原创 Flutter中滑动出现_positions.isNotEmpty异常解决办法
昨天从其他页面回到首页,滑动banner图切换时发现一个错误,虽然没有导致崩溃,但是总是觉得不舒服:Unhandled Exception: 'package:flutter/src/widgets/scroll_controller.dart': Failed assertion: line 110 pos 12: '_positions.isNotEmpty': ScrollController not attached to any scroll views.#0 _Assertion
2020-08-22 13:52:00 2680
原创 使用属性动画ObjectAnimator来实现控件动画
前段时间,公司新开发的VR找房,需要用到一个标示VR房源的动画控件,效果图是下面这种动画效果:首先分析GIF图得知,这组动画又一个圆圈和上下两个扇形组成,通过改变扇形图片的透明度,和位移来实现动画效果。然后我们在布局中先定义3个ImageView来组合这个动画中的元素: <ImageView android:id="@+id/ivVrBorder" android:layout_width="60dp" android:layout_height
2020-08-22 00:07:48 900
原创 利用kotlin协程和retrofit2,LiveData,ViewModel实现一个简单的网络请求框架
今天我们利用LiveData,ViewModel,retrofit2,kotlin协程来搭建一个MVVM的网络请求框架,利用数据来驱动UI更新变化,将数据和UI进行分离。1.新建一个ApiService接口,由于我们常用的网络请求是get和post,所以这里利用retrofit定义这两张请求类型的公共方法,由于retrofit2中已经支持了对协程的支持,所以抽取的get和post方法如下:interface ApiService { @GET suspend fun <T>
2020-08-20 00:41:03 1799 1
原创 Flutter学习六之实现一个带筛选的列表页面
上期实现了一个网络轮播图的效果,自定义了一个轮播图组件,继承自StatefulWidget,我们知道Flutter中并没有像Android中activity的概念。页面见的跳转是通过路由从一个全屏组件跳转到另外的一个全屏组件,那如果我想在A组件中更新B组件的数据应该怎么实现呢?今天我们来实现一个支持筛选的列表页面。前面我们已经实现来一个支持下拉刷新和上拉加载更多的列表组件,这里就不在做更多介绍来,效果图如下:通过点击左滑菜单筛选列表的数据。由于列表在之前的一篇文章已经说明过Flutter学习四之实现一
2020-08-19 00:05:25 1536
原创 Flutter学习五之网络请求和轮播图的实现
上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在flutter中,怎样实现一个网络请求呢 官方使用的是dart io中的HttpClient发起的请求,但HttpClient本身功能较弱,很多常用功能都不支持。所以这里我们直接使用国内的开源库 dio,dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等功能。首先我们导入开源库dio,目前的最新版本是 dio: ^
2020-08-17 01:26:16 338
原创 Flutter学习四之实现一个支持刷新加载的列表
上一篇文章用Scaffold widget搭建了一个带底部导航栏的的项目架构,这篇文章就来介绍一下在flutter中怎么实现一个带下拉刷新和上拉加载更多的一个列表,这里用到了pull_to_refresh的第三方库。1、在pubspec.yaml文件中加入一行代码,导入第三方库。 dependencies: pull_to_refresh: ^1.6.12、新建一个类,继承自StatefulWidget来添加一个新的页面,在build方法中,返回一个 Scaffold 控件,在appbar
2020-08-14 13:48:31 1056
原创 Flutter学习三之搭建一个简单的项目框架
上一篇文章介绍了Dart的语法的基本使用,从这篇文章开始,开发一个基于玩Android网站的app。使用的他们开放的api来获取网站数据。根据网站的结构,我们app最外层框架需要添加一个底部导航栏,导航栏有5给tab,每个tab对应一个页面,分别是首页,项目,公众号,问答,我的等5个模块。在Android中,如果要实现这样的UI框架,有很多中实现方式,常用的就是一个Activity里面配合多个fragment来实现。但是在Flutter中并没有activity和fragment的组件。Flutter中
2020-08-13 14:36:23 508
原创 Flutter学习二之Dart语言介绍
上次我记录了Flutter的环境搭建,这次来简单记录一下Drat语言,Flutter是 Google推出并开源的移动应用开发框架,开发语言是Dart,那么Dart语言和其他的语言在语法上有上面区别呢,就我目前了解到的一部分,其实有很多java或者kotlin的影子。一 、变量声明1.var类似于kotlin中的var,它可以接收任何类型的变量,和kotlin一样第一次赋值和就不能再次改变变量的类型了。var t;t = "hi world";// 下面代码在dart中会报错,因为变量t的类型已经
2020-08-13 14:34:32 182
原创 Flutter学习一之环境搭建
MacOS上搭建Flutter开发环境flutter官网下载最新的安装包,https://flutter.io/sdk-archive/#macos解压安装包到你想安装的目录。直接解压或者是用unzip命令打开mac终端,输入命令 open -e .bash_profile打开环境变量配置,在打开的文件中添加下面这段配置:export PATH=$PATH:/Users/caojing/flutter/flutter/bin export PATH=${PATH}:${ANDROID_HOM
2020-08-13 14:29:08 160
原创 仿淘宝首页功能菜单实现可动态配置的进度展示
最近新需求要我们将app首页的功能菜单,做成类似于淘宝首页功能菜单滑动进度展示的样子,同时要满足,首页功能菜单的栏位可以后台动态配置:每页展示的行数和列数,滑动进度类似于淘宝首页菜单的样子。通过观察可以发现,淘宝菜单进度条红线的宽度比上灰线的宽度等于屏幕的宽度比上菜单的总宽度。1.自定义底部进度条控件继承View,实现其构造方法。重写onDraw方法绘制两条横线,一条表示进度,一条表示要...
2019-11-15 11:13:44 1003
原创 Kotlin扩展函数和属性
Kotlin 可以对一个类的属性和方法进行扩展,对被扩展的类代码本身不会造成任何影响。扩展函数可以为已经存在的类添加新的方法,并且不会修改原来的类。扩展函数由一下几个模块组成://Type:表示要扩展的类//functionName:表示扩展函数的方法名fun Type.functionName(){//扩展函数的逻辑}具体使用可以看下面的例子,我们定义一个String类的扩展...
2019-09-13 09:37:16 276
原创 Activity禁用全局点击事件
android 事件分发机制是从Activity-ViewGroup-View,层层分发的,通过activtiy的dispatchTouchEvent方法分发到ViewGroup的dispatchTouchEvent,ViewGroup通过调用onInterceptTouchEvent方法来判断是否拦截事件,如果不拦截就继续分发到View中,然后遍历ViewGrop中所有子View找到我们点击的V...
2019-09-07 11:49:56 3584
原创 Android WebView时重新加载导致页面刷新的问题
最近碰到一个需求,用WebView加载页面,选择了筛选条件之后,跳转到新的webVIew页面之后再返回,原来的筛选条件由于页面刷新导致已经清空,怎样才能解决返回的时候不去重新加载页面呢,网上很多答案是设置webView页面缓存,但是对部分h5页面还是没有效果。也有的博客说可以每次跳转到新的url的时候,可以addView 一个webView,返回的时候就回到上一个webView,这种方法是可行的...
2019-09-07 10:44:07 6973
原创 Android使用Jsoup来解析html
有时候可能我们会有这样的需求,拿到一个url链接,然后获取到里面的数据,再转换成原生来实现这个html页面。实现要解析html,应该和xml解析类似,先获取标签,再对标签里面的内容进行解析,一层层嵌套。Jsoup用法:1.在工程gradle中allprojects中加入下面这句话 maven { url "https://jsoup.org/" }2.在项目gradle中引入 ap...
2019-09-03 19:20:52 573
转载 Android利用BaseRecyclerViewAdapterHelper开源库实现多布局拖拽功能
最近项目需要一个多种类型图片之间的互相拖拽的效果,之前,由于是采用RecleView嵌套RecleView实现的,所以只能支持单个RecleView之间的相互拖拽,后来采用BaseRecyclerViewAdapterHelper开源库的多布局使用一个RecleView来实现不同类型的拖拽功能。类型是于下面这种布局,不同类型的图片可以互相拖拽:新建一个可以支持拖拽的adapter,继承自Bas...
2019-08-31 11:49:10 1552 1
原创 Glide一些不常用的用法记录
Glide是作为一个快速高效的Android图片加载库,几乎能满足日常对远程图片的拉取/缩放/显示的一切需求。使用起来也很方便,常见用法,也就一行代码就ok:Glide.with(this) .load(url) .placeholder(R.drawable.placeholder) .into(view);从 Glide 4.3.0 开始,可以为请求失败的图片url重新设置新...
2019-08-30 16:49:22 384
原创 关于两个Activity切换时生命周期的问题记录
前段时间做项目,有一个功能,需要从Aactivity(简称A)跳转到Bactivity(简称B), 需要在B finish的时候,保存一个字段到数据库中,然后在A 中的onResume()方法中根据这个字段来更新UI信息,开始的时候我直接在B的OnDestroy方法中保存字段,但是发现返回到A的时候,字段并没有改变,后来观察发现,B返回到A的时候,生命周期是下图这样的,并不是我一直认...
2018-03-25 16:44:59 335
原创 时间戳转换
13位时间戳转10位时间戳去掉后三位,10位转13位时间戳后面补3个零例如:用java 转换10位时间戳:1363948516 在后面补充3个零Date date = new Date(Long.parseLong("1363948516000")); final SimpleDateFormat format = new SimpleDateFormat("yy
2015-06-29 13:56:19 607
原创 Android控件点击事件的简单方法
xml代码 <RelativeLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="4"
2015-06-12 20:55:18 416
原创 用eclipse统计代码
1. 按 CTRL+H 打开查找对话框 选择file search按下图方式输入 注意: I. 输入查找\n, 勾选正则式选项 II. 输入文件匹配, *.java是所有java文件 III. 勾选 Enclosing projects 代表当前项目点击Search 就可以看到匹配的个数也就是行数最后可以通过修改\n为
2014-08-31 23:13:33 380
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人