Andorid-foreground 解析


foreground 前景色

  foreground 也就是前景色,它与background相对应,顾名思义,它指定的drawable是在view视图的上方绘制的。

开发实例

1.实现遮罩层:

<FrameLayout
        android:id="@+id/id_frameLayout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:foreground="#aaff0000"android:foregroundTintMode="src_in"><TextView
            android:id="@+id/id_text"android:layout_width="100dp"android:layout_height="100dp"android:text="NO.1"android:gravity="center_horizontal|center_vertical"/></FrameLayout>

实现效果

2.实现点击效果

 属性能设置为drawable,我们自然就想到了也可以使用 selector drawable,在点击时套上drawable来实现类似点击效果的功能

xml代码:

 <FrameLayout
        android:id="@+id/id_frameLayout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@android:color/transparent"android:foreground="@drawable/selector_foreground"android:foregroundTintMode="src_in"><TextView
            android:id="@+id/id_text"android:layout_width="100dp"android:layout_height="100dp"android:text="NO.1"android:gravity="center_horizontal|center_vertical"/></FrameLayout>

drawable:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"android:enterFadeDuration="@android:integer/config_shortAnimTime"android:exitFadeDuration="@android:integer/config_mediumAnimTime"><item android:state_pressed="true"><shape
            android:shape="rectangle"><solid android:color="#15000000"/></shape></item><item android:drawable="@android:color/transparent"></item></selector>

当然别忘记了在代码中给 frameLayout 设置点击事件

实现效果:

缺陷

  Android在所有布局的基类 View 类中 就定义了 Foreground 这个属性,但是测试发现 运行时,只有FrameLayout布局上设置该属性才会生效。观察View的代码发现这样一段。它只针对是FrameLayout的实例做获取该styleable的操作。
case R.styleable.View_foreground:if (targetSdkVersion >= VERSION_CODES.M || this instanceof FrameLayout) {setForeground(a.getDrawable(attr));}break;case R.styleable.View_foregroundGravity:if (targetSdkVersion >= VERSION_CODES.M || this instanceof FrameLayout) {setForegroundGravity(a.getInt(attr, Gravity.NO_GRAVITY));}break;

解决方案

  模拟,FrameLayout的相关实现为TextView添加foreGround的代码功能
public class ForegroundTextView extends TextView {// UIprivate Drawable foreground;// Controller/logic fieldsprivate final Rect rectPadding = new Rect();private boolean foregroundPadding = false;private boolean foregroundBoundsChanged = false;private boolean backgroundAsForeground = false;// Constructorspublic ForegroundTextView(Context context) {super(context);}public ForegroundTextView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public ForegroundTextView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ForegroundLayout, defStyle, 0);final Drawable d = a.getDrawable(R.styleable.ForegroundLayout_foreground);foregroundPadding = a.getBoolean(R.styleable.ForegroundLayout_foregroundInsidePadding, false);backgroundAsForeground = a.getBoolean(R.styleable.ForegroundLayout_backgroundAsForeground, false);// Apply foreground padding for ninepatches automaticallyif (!foregroundPadding && getBackground() instanceof NinePatchDrawable) {final NinePatchDrawable npd = (NinePatchDrawable) getBackground();if (npd != null && npd.getPadding(rectPadding)) {foregroundPadding = true;}}final Drawable b = getBackground();if (backgroundAsForeground && b != null) {setForeground(b);} else if (d != null) {setForeground(d);}a.recycle();}/*** Supply a Drawable that is to be rendered on top of all of the child views in the layout.** @param drawable The Drawable to be drawn on top of the children.*/public void setForeground(Drawable drawable) {if (foreground != drawable) {if (foreground != null) {foreground.setCallback(null);unscheduleDrawable(foreground);}foreground = drawable;if (drawable != null) {setWillNotDraw(false);drawable.setCallback(this);if (drawable.isStateful()) {drawable.setState(getDrawableState());}} else {setWillNotDraw(true);}requestLayout();invalidate();}}/*** Returns the drawable used as the foreground of this layout. The foreground drawable,* if non-null, is always drawn on top of the children.** @return A Drawable or null if no foreground was set.*/public Drawable getForeground() {return foreground;}@Overrideprotected void drawableStateChanged() {super.drawableStateChanged();if (foreground != null && foreground.isStateful()) {foreground.setState(getDrawableState());}}@Overrideprotected boolean verifyDrawable(Drawable who) {return super.verifyDrawable(who) || (who == foreground);}@Overridepublic void jumpDrawablesToCurrentState() {super.jumpDrawablesToCurrentState();if (foreground != null) {foreground.jumpToCurrentState();}}@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);foregroundBoundsChanged = true;}@Overridepublic void draw(Canvas canvas) {super.draw(canvas);if (foreground != null) {final Drawable foreground = this.foreground;if (foregroundBoundsChanged) {foregroundBoundsChanged = false;final int w = getRight() - getLeft();final int h = getBottom() - getTop();if (foregroundPadding) {foreground.setBounds(rectPadding.left, rectPadding.top, w - rectPadding.right, h - rectPadding.bottom);} else {foreground.setBounds(0, 0, w, h);}}foreground.draw(canvas);}}@TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public boolean onTouchEvent(MotionEvent e) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {if (e.getActionMasked() == MotionEvent.ACTION_DOWN) {if (foreground != null) {foreground.setHotspot(e.getX(), e.getY());}}}return super.onTouchEvent(e);}
}

原文地址:http://blog.csdn.net/zhuoxiuwu/article/details/50976145

新特性:Andorid-foreground 解析相关推荐

  1. java8新特性stream深入解析

    2019独角兽企业重金招聘Python工程师标准>>> 继续java8源码的发烧热,越看越是有充实的感觉. 数据时代下的产物 Java顺应时代的发展推出的高效处理大量数据能力的api ...

  2. 【转】Silverlight 3 Beta 新特性解析(7)- Child Window和Shader Effect篇

    前提条件: 阅读本文之前请确认你已经安装了如下软件 Visual Studio 2008 (Express) SP1 Silverlight 3 Tools For Visual Studio Mic ...

  3. JSPatch近期新特性解析

    JSPatch在社区的推动下不断在优化改善,这篇文章总结下这几个月以来 JSPatch 的一些新特性,以及它们的实现原理. performSelectorInOC JavaScript 语言是单线程的 ...

  4. python3.8新特性 逻辑表达式_Python3.8正式发布!新特性解析在这里

    Python3.8正式发布!新特性解析在这里 诗书塞外 Python程序员 10月14日,Python 3.8 正式版发布.这也意味着一个Python开发周期的结束,和另一个开发周期的开始.Pytho ...

  5. JavaScript ES2021 最值得期待的 5 个新特性解析

    在写本文时,本文提到的新的 JavaScript 提案功能已进入第 4 阶段,并且几乎肯定会包含在 ES2021 中.你已经可以开始在 最新版本的浏览器,Node.js 和 Babel 中使用. 注意 ...

  6. Java8新特性解析

    Java 8中的新特性有: 接口中默认方法,lambda 表达式,方法引用,重复注解,流.函数.接口.map扩展.日期中的新变化等,接下来一一介绍 1. Default Methods for Int ...

  7. Java 8新特性探究(二)深入解析默认方法

    转载自 Java 8新特性探究(二)深入解析默认方法 什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. ...

  8. JavaScript ES2021 新特性解析

    JavaScript ES2021 新特性解析 新特性列表 String.prototype.replaceAll Promise.any 逻辑运算符和赋值表达式 数值分隔符 Intl.ListFor ...

  9. 资源放送丨《 先睹为快!Oracle 20c新特性解析》PPT视频

    前段时间,墨天轮邀请到了云和恩墨CTO.ACDU核心专家."Oracle百科全书" 杨廷琨 老师分享<先睹为快!Oracle 20c新特性解析>,在这里我们共享一下PP ...

最新文章

  1. FZ35恒流电子负载检测测试
  2. unicode字符串 转 中文
  3. ps自定义形状工具_【福利】3000款PS自定义形状免费打包下载
  4. 外链引入css有哪些方式_快速收录的外链操作技巧
  5. JavaEE——Spring4--(9)Spring的事务管理(注解方式)
  6. 基于ARM的车牌识别技术研究与实现
  7. [设计模式-结构型]装饰模式(Decorator)
  8. Linux常用命令——xargs
  9. MongoDB Replica Set 选举过程
  10. 2021牛客寒假算法基础集训营5,签到题BF
  11. Matlab2013a破解问题
  12. 中国网络安全厂商、安全培训机构大全(2019-7-1)
  13. B2B行业使用什么CRM好? B2B行业的专属CRM—协同级CRM
  14. 使用电脑过程中突然无法复制粘贴了
  15. STM32通过SPI读W25Q64的ID时钟分析
  16. 那些陪伴了我大学青春的网易博客也要停运啦
  17. JAVA工作日历天数(工作日/非工作日)- 基于法定节假日
  18. 移动硬盘 Windows-延缓写入失败:无法为某文件保存所有数据,数据已经丢失
  19. 如何推广企业微信号?企业进行公众号的推广有哪些方法?
  20. 内容为王,如何打造爆款小红书笔记?

热门文章

  1. 磁盘镜像分析工具Autopsy
  2. ARCGIS 出图的时候写出微克每立方米的方法
  3. windows10家庭版如何修改Administrators名字
  4. 微信小程序的自制聊天框
  5. 信息系统项目管理师考试大纲(组织整理)
  6. EMQ X 联手万为,打造基于 AIoT 的物联网视频接入解决方案
  7. 长度9-20个字符,必须包含大小写字母和特殊字符(空格除外)
  8. 无皇刀谭 #183; 异邦人
  9. 威海高考2021成绩查询,2021年威海高考状元名单公布,威海高考状元学校资料及最高分...
  10. 冒泡排序时间、空间复杂度