编写可复用的自定义按钮
转载:http://marshal.easymorse.com/archives/4606
Android的布局,要比iOS复杂的多。如果想写出和iOS类似的交互体验,付出的代价往往要增加一个数量级。
现在有个正在开发的Android项目,里面已经有了一些不合理的UI实现方式。比如按钮是一张图:
可以看出,应该用编程的方式来实现这个按钮,比如xml声明drawable,一个矩形框,四个边是圆角,要有个很细的边框,黑色的,背景色使用渐进色效果。登录使用文字而不是在图形里。
这样的好处很多:
- 自由的在不同分辨率屏幕下做适配,不必考虑图形的长宽比;
- 当文字改动后,不必喊上美工一起加班处理;
- 文字的国际化。
不过,本文只想对原项目做稍微的改动,而不想推倒重来,我打算另写一篇文章来说明上述方案的实现。
本文方案的基本思路是,还是用这个图,但是增加复用性,开发者只需在布局中使用自定义按钮,就可以让已经存在的这种布局具备点击后高亮的效果,而不必准备多张图,写冗长的xml文件做selector。
实现后的效果,在手指触碰到该按钮的时候:
抬起或者移动到按钮外区域恢复原来的样子。
这里布局还是在xml中,类似这样:
<com.witmob.CustomerButtonandroid:id=”@+id/login”android:layout_width=”wrap_content”android:layout_height=”wrap_content”android:layout_alignParentLeft=”true”android:layout_centerVertical=”true”android:layout_marginLeft=”26dp”android:background=”@drawable/login_login_but”/>
实现的按钮代码:
package com.witmob;import android.content.Context;
import android.graphics.LightingColorFilter;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;public class CustomerButton extends Button {public CustomerButton(Context context) {super(context);this.init();}public CustomerButton(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);this.init();}public CustomerButton(Context context, AttributeSet attrs) {super(context, attrs);this.init();}private void init(){this.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {int action=event.getActionMasked();switch (action) {case MotionEvent.ACTION_DOWN:getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x000000FF));getBackground().invalidateSelf();break;case MotionEvent.ACTION_UP:getBackground().clearColorFilter();getBackground().invalidateSelf();break;case MotionEvent.ACTION_MOVE:Rect rect=new Rect();v.getDrawingRect(rect);if(!rect.contains((int)event.getX(),(int)event.getY())){getBackground().clearColorFilter();getBackground().invalidateSelf();}break;default:break;}return false;}});}}
代码要点:
- 需要使用OnTouchListener,处理手指按下,抬起和移动到区域外的处理;
- 使用ColorFilter,获取背景色的Drawable对象,增加颜色过滤;
- 操作Rect,结合手指坐标,判断是否在区域内部;
- 另外,需要返回false,在OnTouchListener,否则按钮的OnClickListener将不能生效。
备注:这确实是很好的方法,这样就不需要做很多按下和抬起的效果了,哎毕竟不是每个公司都有美工的,而且代码是可以复用的
编写可复用的自定义按钮相关推荐
- 用仿ActionScript的语法来编写html5——第七篇,自定义按钮
第七篇,自定义按钮 这次弄个简单点的,自定义按钮. 其实,有了前面所定义的LSprite,LBitmap等类,定义按钮就很方便了. 下面是添加按钮的代码, function gameInit(even ...
- html如何复用其它页面,编写可以复用的 HTML 模板
Web 组件简介编写可以复用的 HTML 模板(本文)从 0 开始创建自定义元素使用 Shadow DOM 封装样式和结构Web 组件的高阶工具 Web 组件规范中最不被认可但是最强大的功能之一是 ...
- 按钮配置之自定义按钮使用(一)——JEPLUS软件快速开发平台
为什么80%的码农都做不了架构师?>>> JEPLUS按钮配置之自定义按钮使用(一) 系统开发过程中无论是表单的默认按钮或是列表的默认按钮以及Action的默认按钮有时候并不能 ...
- 自定义按钮动态变化_新闻价值的变化定义
自定义按钮动态变化 I read Bari Weiss' resignation letter from the New York Times with some perplexity. In par ...
- Android基础入门教程——2.4.7 构建一个可复用的自定义BaseAdapter
Android基础入门教程--2.4.7 构建一个可复用的自定义BaseAdapter 标签(空格分隔): Android基础入门教程 本节引言: 如题,本节给大家带来的是构建一个可复用的自定义Bas ...
- Android入门教程四十之构建一个可复用的自定义BaseAdapter
如题,本节给大家带来的是构建一个可复用的自定义BaseAdapter,我们每每涉及到ListView GridView等其他的Adapter控件,都需要自己另外写一个BaseAdapter类,这样显得 ...
- 【iOS开发-8】UIButton类型属性简单归纳以及自定义按钮的设置
(1)UIButton类继承自UIControl,而UIControl继承自UIView,因为UIView就是个矩形区域,所以UIButton实例化的对象其实都是一个矩形,虽然有各种圆角.增加联系人. ...
- 【实用】表维护视图SM30增加自定义按钮的实现
表维护视图SM30增加自定义按钮的实现 1.新建Table并通过"表维护生成器"生成SM30维护视图. 正常的创建表维护视图到这一步也就结束了,最多是进函数组调整字段名称和显示效果 ...
- 如何在 SAP Fiori Elements List Report 表格工具栏里增添新的自定义按钮
如下图所示,这是 SAP Fiori Elements List Report 一个例子,我们想在表格工具栏里,新增一个自定义按钮: 实现方式 在 SAP Fiori Elements 项目工程里,修 ...
最新文章
- Jmail的主要参数列表
- 文本查重:difflib.SequenceMatcher
- c语言的32个关键词
- leetcode184. 部门工资最高的员工(SQL) 连接+嵌套查询
- 从Wireshark看TCP连接的建立与关闭
- UI标签库专题十三:JEECG智能开发平台 ckfinder(ckfinder插件标签)
- 安卓学习笔记02:测试安卓开发环境
- 关于升级Vmware ESXI6.7 主机挂在ISCSI共享存储的方法
- hybrid环境下划分vlan一个实验 ————一故障分析
- 基频和倍频的概念_小知识:关于倍频程
- Shapefile属性操作之删
- monkey命令——压力测试——个人总结
- 币图网以太坊开发实例_去中心化概念模型与架构设计
- Context-Aware Zero-Shot Recognition 论文翻译
- 求解广州到上海用时最短的路径,使用中国地图超详细剖析Dijkstra算法思想
- 什么是单工、半双工和双工通信(最详细)
- C语言实现贪吃蛇小游戏(详解)
- 数字图像处理 彩色图象处理
- android6.0数据恢复,安卓6.0以上提取技术和微信恢复研究.pdf
- 阶梯电价C语言PTA
热门文章
- Clojure 的身份与状态思想
- Android NDK 【错误】The method loadLibrary(String) is undefined for the type Settings.Syste
- JavaScript Module Pattern
- Pdftk - The PDF Toolkit
- 一些常用的JavaScript总结
- XYGame-AI设计3-行为树-第1版本
- Bazel C++ 基础[翻译]
- html5 video.js 使用及兼容所有浏览器
- AngularJs 实战 -慕课网
- 正则表达式确实是一种考验