转载: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将不能生效。

备注:这确实是很好的方法,这样就不需要做很多按下和抬起的效果了,哎毕竟不是每个公司都有美工的,而且代码是可以复用的

编写可复用的自定义按钮相关推荐

  1. 用仿ActionScript的语法来编写html5——第七篇,自定义按钮

    第七篇,自定义按钮 这次弄个简单点的,自定义按钮. 其实,有了前面所定义的LSprite,LBitmap等类,定义按钮就很方便了. 下面是添加按钮的代码, function gameInit(even ...

  2. html如何复用其它页面,编写可以复用的 HTML 模板

    Web 组件简介编写可以复用的 HTML 模板(本文)从 0 开始创建自定义元素使用 Shadow DOM 封装样式和结构Web 组件的高阶工具 Web 组件规范中最不被认可但是最强大的功能之一是  ...

  3. 按钮配置之自定义按钮使用(一)——JEPLUS软件快速开发平台

    为什么80%的码农都做不了架构师?>>>    JEPLUS按钮配置之自定义按钮使用(一) 系统开发过程中无论是表单的默认按钮或是列表的默认按钮以及Action的默认按钮有时候并不能 ...

  4. 自定义按钮动态变化_新闻价值的变化定义

    自定义按钮动态变化 I read Bari Weiss' resignation letter from the New York Times with some perplexity. In par ...

  5. Android基础入门教程——2.4.7 构建一个可复用的自定义BaseAdapter

    Android基础入门教程--2.4.7 构建一个可复用的自定义BaseAdapter 标签(空格分隔): Android基础入门教程 本节引言: 如题,本节给大家带来的是构建一个可复用的自定义Bas ...

  6. Android入门教程四十之构建一个可复用的自定义BaseAdapter

    如题,本节给大家带来的是构建一个可复用的自定义BaseAdapter,我们每每涉及到ListView GridView等其他的Adapter控件,都需要自己另外写一个BaseAdapter类,这样显得 ...

  7. 【iOS开发-8】UIButton类型属性简单归纳以及自定义按钮的设置

    (1)UIButton类继承自UIControl,而UIControl继承自UIView,因为UIView就是个矩形区域,所以UIButton实例化的对象其实都是一个矩形,虽然有各种圆角.增加联系人. ...

  8. 【实用】表维护视图SM30增加自定义按钮的实现

    表维护视图SM30增加自定义按钮的实现 1.新建Table并通过"表维护生成器"生成SM30维护视图. 正常的创建表维护视图到这一步也就结束了,最多是进函数组调整字段名称和显示效果 ...

  9. 如何在 SAP Fiori Elements List Report 表格工具栏里增添新的自定义按钮

    如下图所示,这是 SAP Fiori Elements List Report 一个例子,我们想在表格工具栏里,新增一个自定义按钮: 实现方式 在 SAP Fiori Elements 项目工程里,修 ...

最新文章

  1. Jmail的主要参数列表
  2. 文本查重:difflib.SequenceMatcher
  3. c语言的32个关键词
  4. leetcode184. 部门工资最高的员工(SQL) 连接+嵌套查询
  5. 从Wireshark看TCP连接的建立与关闭
  6. UI标签库专题十三:JEECG智能开发平台 ckfinder(ckfinder插件标签)
  7. 安卓学习笔记02:测试安卓开发环境
  8. 关于升级Vmware ESXI6.7 主机挂在ISCSI共享存储的方法
  9. hybrid环境下划分vlan一个实验 ————一故障分析
  10. 基频和倍频的概念_小知识:关于倍频程
  11. Shapefile属性操作之删
  12. monkey命令——压力测试——个人总结
  13. 币图网以太坊开发实例_去中心化概念模型与架构设计
  14. Context-Aware Zero-Shot Recognition 论文翻译
  15. 求解广州到上海用时最短的路径,使用中国地图超详细剖析Dijkstra算法思想
  16. 什么是单工、半双工和双工通信(最详细)
  17. C语言实现贪吃蛇小游戏(详解)
  18. 数字图像处理 彩色图象处理
  19. android6.0数据恢复,安卓6.0以上提取技术和微信恢复研究.pdf
  20. 阶梯电价C语言PTA

热门文章

  1. Clojure 的身份与状态思想
  2. Android NDK 【错误】The method loadLibrary(String) is undefined for the type Settings.Syste
  3. JavaScript Module Pattern
  4. Pdftk - The PDF Toolkit
  5. 一些常用的JavaScript总结
  6. XYGame-AI设计3-行为树-第1版本
  7. Bazel C++ 基础[翻译]
  8. html5 video.js 使用及兼容所有浏览器
  9. AngularJs 实战 -慕课网
  10. 正则表达式确实是一种考验