豪言壮志

今天天气不错,挺风和日丽的,出去逛逛街,溜溜弯,拍上一张美图,配上高逼格的格言警句,发到朋友圈,一片鸡汤文就此诞生。。。

最近会有事没事会在朋友圈发动态:写一句格言警句,配上一张意境美图。因为懒,我总是在想,图片能够自动随机网上选择该多好,能不能直接将文字写在图片上,能不能一键分享到朋友圈,再配上二维码,那感觉,妙。。。

花半天时间找了一下,目标就它了:微信的「图片编辑器」,然后自己配上图片的素材,不就能满足上述条件嘛。

可是图片素材只能是手机相册,万一以后用完了怎么办,而且没有二维码。微信估计不干了:你行你上啊。对啊,那就自己干。

确定效果图

先不说马赛克、涂鸦、裁剪等功能,我现在需要的是文字编辑的功能,所以就先搞一搞这个。

微信的效果我就不贴出来了,大家估计都体验过吧,哈哈。

什么,你没有用过?呵呵,(尴尬),那就只是你一个而已。。。对,你应该与时俱进一下。

纳尼,你们都没有用过?!好吧,你们怎么看到我的文章的,难道不是搜索微信图片编辑器过来的吗~

给大家贴上目标效果图:

哦哦,你要微信的效果是吧,OK,拿出你的手机,给我发张图片就可以啦。

开始实现布局界面

好,开始撸代码了。

创建工程,引用最新的 Kotlin 库:

// dependency.gradle
def anko_version = "0.10.5"ext {ankoSdk = "org.jetbrains.anko:anko-sdk25:$anko_version" // sdk15, sdk19, sdk21, sdk23 are also availableankoAppCompat = "org.jetbrains.anko:anko-appcompat-v7:$anko_version"ankoListeners = "org.jetbrains.anko:anko-sdk25-listeners:$anko_version"
}// basemodule.gradle
dependencies {// 最新的 api 引用方式api ankoSdkapi ankoAppCompatapi ankoListeners
}

在 `MainActivity` 中创建布局:

relativeLayout {editToolBar = linearLayout {button("编辑")}// todo: 之后采用 constraintLayouteditMask = verticalLayout {relativeLayout {textView("取消").lparams(wrapContent, wrapContent) {alignParentLeft()}textView("完成").lparams {alignParentRight()}}editView = editText {padding = 15gravity = Gravity.TOPbackgroundColor = Color.GREEN// 刚进入界面时不获取焦点isFocusable = false}.lparams(matchParent, 0, 1f)// scrollView 是为 view 漂浮在软键盘上做准备scrollView {linearLayout {textView("tool bar")}}}.lparams(matchParent, matchParent) {alignParentBottom()}
}

额,界面效果丑是丑了点,但咱看中的是实力,对吧。况且,以后咱可以美颜呀~~

向上弹出界面

网上通用的几个解决方案:Dialog,PopupWindow,Activity 等都可以实现相同的效果。

但是我觉得比较重,再加上要写比较多的代码(这是主要原因),所以我采用动画的方式实现这个效果。

给「编辑」按钮添加点击事件,开启动画:

onClick {ValueAnimator.ofInt(0, rootView.height) // 设置遮罩的高度变化是从 0 到 整个界面的高度.setDuration(100) // 动画时长:100ms.apply {// 添加监听,动画中数值的每一次变化,都是遮罩界面高度的变化addUpdateListener {editMask.layoutParams = editMask.layoutParams.apply {// 遮罩高度动态变化,值为每次动画改变后的值height = it.animatedValue as Int}}}.start() // 开始动画
}

好啦,基本上完事大吉啦,聪明如你,肯定知道这个动画什么意思吧。如果你第一次接触,就仔细看代码,有注释哦。

细节优化

动画启动时,需要隐藏「编辑」按钮;

点击「取消」或「完成」时,隐藏「编辑界面」,显示「编辑」按钮;

动画不需要每次都创建等等。

最终界面布局:

relativeLayout {editToolBar = linearLayout {button("编辑").onClick { openEditMask()}}.lparams(matchParent, wrapContent) {alignParentBottom()}// todo: 之后采用 constraintLayouteditMask = verticalLayout {relativeLayout {textView("取消").lparams(wrapContent, wrapContent) {alignParentLeft()}.onClick { closeEditMask() }textView("完成").lparams {alignParentRight()}.onClick { closeEditMask() }}editView = editText {padding = 15gravity = Gravity.TOPbackgroundColor = Color.GREEN// 刚进入界面时不获取焦点isFocusable = false}.lparams(matchParent, 0, 1f)// scrollView 是为 view 漂浮在软键盘上做准备scrollView {linearLayout {textView("tool bar")}}}.lparams(matchParent, 0) {alignParentBottom()}
}

提取出来的方法:

// 关闭遮罩
private fun openEditMask() {openAnimator.start()editToolBar.visibility = View.GONE
}// 关闭遮罩
private fun closeEditMask() {closeAnimator.apply {addListener(object : AnimatorListenerAdapter() {override fun onAnimationEnd(animation: Animator?) {editToolBar.visibility = View.VISIBLE}})}.start()
}// 呈现动画
private val openAnimator by lazy {ValueAnimator.ofInt(0, window.decorView.height).setDuration(100).apply {addUpdateListener {val h = it.animatedValue as InteditMask.layoutParams = editMask.layoutParams.apply {height = h}}}
}// 关闭动画
private val closeAnimator by lazy {ValueAnimator.ofInt(window.decorView.height, 0).setDuration(100).apply {addUpdateListener {val h = it.animatedValue as InteditMask.layoutParams = editMask.layoutParams.apply {height = h}}}
}

结束

这个小功能算是搞完了,感觉好简单啊,真不知道为什么我弄了一天才写出来,哎,看来我不是天才,你才是啊。

如果文章对你有帮助的话,欢迎关注公众号:goodKotlin,你的关注,就是最大的支持。

文章源码:GitHub: Ethos(https://github.com/xwdoor/Ethos),欢迎大家给颗星星,哈哈。

推荐阅读:
1. 图片编辑器–向上弹出文字编辑框(遮罩)界面
2. 图片编辑器–视图布局 View 悬浮在软键盘上

模仿微信图片编辑器--动画实现向上弹出文字编辑框(遮罩)界面相关推荐

  1. 【微信小程序】底部弹出式搜索框

    微信开发者工具的准备工作详见: [微信小程序]初始页面和导航栏. 设计中会使用到Vant Weapp组件库,添加组件库的方法参照官网:Vant Weapp - 轻量.可靠的小程序 UI 组件库. 注意 ...

  2. android中点击按钮弹出一个编辑框,本人是在Button的基础上加了Dialog,Dialog添加了一个编辑框,怎么将Button上的显示文字变成...

    button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Alert ...

  3. Android自定义弹窗模仿微信,Android仿微信右上角点击加号弹出PopupWindow

    本文实例为大家分享了Android仿微信右上角点击加号弹出展示的具体代码,供大家参考,具体内容如下 一.要弹出的布局,随便设计 android:layout_width="match_par ...

  4. Android之靠谱的Activity从底部向上弹出,finish从顶部向下消失(不黑屏)

    1 .需求 要求Activity从底部向上弹出,finish从顶部向下消失(不黑屏) 2.解决办法 准备3个动画xml文件 app_bottom_in.xml <?xml version=&qu ...

  5. html自定义js程序,JS中微信小程序自定义底部弹出框

    实现微信小程序底部弹出框效果,代码分为html,css和js两部分,具体代码详情大家参考下本文. html CSS .commodity_screen { width: 100%; height: 1 ...

  6. 从页面底部向上弹出dialog,消失时逐渐向下(转)

    我想实现一个效果,从底部向上逐渐弹出.如下图所示: 1.点击 显示 按钮时,一个dialog对话框从底部慢慢向上弹出. 2.关闭dialog时, dialog缓慢的移动向底部消失.很平滑的效果.   ...

  7. JAVA制作弹出小广告的程序_微信小程序实现首页弹出广告

    本文实例为大家分享了微信小程序实现首页弹出广告的具体代码,供大家参考,具体内容如下 这个微信小程序首页广告demo 仅供有需要的参考 .wxml this is ad //事件 catchtouchm ...

  8. 小程序全局悬浮窗_微信小程序悬浮窗弹出怎么实现?

    微信小程序悬浮窗弹出怎么实现?很多的微信小程序管理员会在微信小程序界面开发微信小程序悬浮窗弹出功能,接下来小编会为大家介绍微信小程序悬浮窗弹出关注实现的全部步骤哦. 微信小程序悬浮窗弹出怎么实现? 微 ...

  9. 【微信小程序封装底部弹出框二】

    [微信小程序封装底部弹出框二] <!--index.wxml--> <view><button style="margin-top: 300px;" ...

最新文章

  1. 全球首款64核AMD工作站发布,搭载最新线程撕裂者Pro,号称“地表最强”
  2. 工作流集成第三方jsp表单
  3. VS2017 快捷键
  4. oracle使用游标批量删除数据,oracle 游标批量处理数据
  5. TStringGrid - 重绘时RECT解决一块空白区域
  6. 当ligerui的grid出现固定列与非固定列不在同一水平线上时,改怎么处理
  7. python黑客帝国代码雨源代码_黑客帝国数字雨 源代码分享
  8. 淘宝运营 DSR评分太低的影响 用补单的方法具体操作步骤,提高DSR评分
  9. Python 自动化办公之自动识别并点击按钮
  10. windows装机硬盘超过2T问题
  11. win系统设置定时开机
  12. Collection集合
  13. 工具 | 快速视频压缩与格式转换
  14. 编程题005--判断是不是平衡二叉树--niuke
  15. Verilog 实现111序列检测器——Moore和Mealy型状态机实现
  16. 「BSOJ2040」 吃西瓜 - Dp/三维最大子长方体
  17. geogebra 在线公式绘图, 支持3d
  18. Abnova丨 CD81单克隆抗体相关参数和应用
  19. 初始化springboot项目
  20. Python:实现求一个数的位数之和算法(附完整源码)

热门文章

  1. 我用什么工具写公众号
  2. java判断对象属性为空_Java判断对象属性全为空
  3. 电脑服务器显示过期,win10系统提示你的设备存在过期风险怎么办_网站服务器运行维护,win10...
  4. python逻辑回归模型建模步骤_Python逻辑回归——建模-评估模型
  5. 深度学习知识点总结-激活函数
  6. 制造业质量管理四大病因
  7. php大型博客,PHP大型Web应用入门(二)
  8. Android SIGABRT的可能原因及开启手机Log日志
  9. 百度云服务器BCC centos实例搭建vsftpd站点
  10. storyboard(故事版)新手教程 图文详解 2.为无约束的故事版添加约束