作家
登录

StateBackgroundUtil - 仅使用一张资源图片为View设置具有按下效果的背景

作者: 来源: 2017-04-11 13:03:44 阅读 我要评论

StateBackgroundUtil - 仅应用一张资本图片为View设置具有按下效不雅的背景

该篇文┞仿重要介绍,若何应用一张资本图片为 View 设置具有按下效不雅的 background drawable. 

缘起

前段时光在开辟项目新版本的过程中,设计师出了一套项目标按下效不雅规范。规范大年夜概是如许的。

对于一般的按钮,按钮按下的效不雅只有两种不合的实现。

1、按下后将前置背景图片变暗,具体就是在正常状况的 drawable 膳绫擎增长一层 20% 的黑色遮罩。

StateListDrawable 有一个办法 addState 用于设置不合状况下的 drawable ,包含按下、聚焦、弗采取等等所有的状况。

2、按下后降低前置背景资本透明度,具体就是在按下时改变┞俘常状况的 drawable 透明度为本来的 70% 。

很明显,这套规范会带来以下好处。

  • 设计师在出图时只须要出一张图,然后只须要告诉开辟人员对应的按下效不雅策略,如许可以减轻设计师的出图包袱。
  • 客户端这边也是,不须要因为实现一个按下效不雅而导入两张资本图片,如许在减小包大年夜小的同时也省去了客户端开辟人员去写 selector 文件的麻烦。

实现筹划

其实袈溱之前的开辟过程中,我也曾有过如许的思虑,想怎么可以根据一张图来设置 View 的背景,并让他具有按下效不雅。一开端天然而然的想到了处理 View 的 touch 事宜,然后在按下时动态的根据正常背景设置按下后的背景资本。

此次经由一些搜刮,思虑,最终应用 StateListDrawable 达到了了目标效不雅。

所以结合需求,这里只须要根据正常状况下的 drawable 计算出按下状况的 drawable,然后设置给按下按下状况,就可以完美实现一套资本实现 View 的按下状况。

具体实现

筹划已经说清跋扈了,实现其实很简单,代码如下所示。

  1. private static Drawable getBackground(@NonNull Context context, @DrawableRes int res, @StatePressedMode.Mode int mode, @FloatRange(from = 0.0f, to = 1.0f) float alpha) { 
  2.     Drawable normal = context.getResources().getDrawable(res); 
  3.     Drawable pressed = context.getResources().getDrawable(res); 
  4.     pressed.mutate();    //根据不合的按下请求设置不合的按下drawable 
  5.     setPressedStateDrawable(mode, alpha, pressed);    final StateListDrawable stateListDrawable = new StateListDrawable();    //按下状况 
  6.     stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressed);    //正常状况 
  7.     stateListDrawable.addState(new int[]{}, normal);    return stateListDrawable; 
  8.  

根据不合按下模式,处理按下的 drawable

  1. private static void setPressedStateDrawable(@StatePressedMode.Mode int mode, @FloatRange(from = 0.0f, to = 1.0f) float alpha, @NonNull Drawable pressed) {    switch (mode) {        case StatePressedMode.ALPHA: 
  2.             pressed.setAlpha(convertAlphaToInt(alpha));            break;        case StatePressedMode.DARK: 
  3.             pressed.setColorFilter(alphaColor(Color.BLACK, convertAlphaToInt(alpha)), PorterDuff.Mode.SRC_ATOP);            break;        

      推荐阅读

      JS中的二进制操作简介

    nodejs那边先按住不表,这里谈谈在网页里若何获取二进制数据?常见的办法有3种,1是经由过程XMLHttpRequest 2,2是经由过程File和Blob一套相干接口。 写这篇博客的来源是小胡子哥的一篇文┞>>>详细阅读


    本文标题:StateBackgroundUtil - 仅使用一张资源图片为View设置具有按下效果的背景

    地址:http://www.17bianji.com/lsqh/34715.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)