`
hemowolf
  • 浏览: 154325 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
阅读更多

    如果您用google play会发现当按下应用图标时,会出现一透明色覆盖在图标上面(如下图)。注意这个不是background效果而是foreground或是遮罩(overlay)。
    
    实现这种效果通常的思路是在容器(LinearLayout、RelativeLayout等)画玩子控件后,再画一透明色或透明图片在容器顶层达到覆盖遮罩的效果。不过这种思路还需重载onTouchEvent来监听手指按下、抬起等,而且实现将非常的繁琐。
    幸好还有更加便捷的实现方法:那就是google在View类中提供的getDrawableState、drawableStateChanged方法。getDrawableState返回的是视图状态,而drawableStateChanged即是状态发生变化时调用。ok!有了这2个api我们就可以挂接到Drawable的callback设置相应的状态(setState),从而根据不同的状态绘制不同的drawable状态(selector).

    下面是一个简单的控件代码

package com.droidwolf.overlay;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.LinearLayout;

public class OverlayContainer extends LinearLayout {
	private Drawable mForeground;
	private final Rect mBound = new Rect();

	public OverlayContainer(Context context) {
		super(context);
	}

	public OverlayContainer(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public Drawable getForegroundDrawable() {
		return mForeground;
	}

	public void setForegroundDrawable(Drawable draw) {
		if (draw == mForeground) {
			return;
		}
		if (mForeground != null) {
			unscheduleDrawable(mForeground);
			mForeground.setCallback(null);
		}
		mForeground = draw;
		if (draw != null) {
			if (draw.isStateful()) {
				draw.setState(getDrawableState());
			}
			draw.setCallback(this);
		}
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		mBound.set(0, 0, getMeasuredWidth(), getMeasuredHeight());
	}

	@Override
	protected void drawableStateChanged() {
		super.drawableStateChanged();
		if (mForeground != null && mForeground.isStateful()) {
			mForeground.setState(getDrawableState());
		}
	}

	@Override
	protected boolean verifyDrawable(Drawable who) {
		return super.verifyDrawable(who) || (who == mForeground);
	}

	@Override
	public void dispatchDraw(Canvas canvas) {
		if (mForeground == null) {
			super.dispatchDraw(canvas);
		} else {
			final int sc = canvas.save();
			super.dispatchDraw(canvas);
			mForeground.setBounds(mBound);
			mForeground.draw(canvas);
			canvas.restoreToCount(sc);
		}
	}
}

 

    需要注意的是如果容器的子控件设置了OnClickListener事件,mForeground绘画状态就有可能失效,这时您需要添加addStatesFromChildren属性并设置为true。
   另:FrameLayout已经实现了
foreground功能。

分享到:
评论

相关推荐

    2023-2028年金属压力容器市场现状与前景调研报告.pdf

    《2023-2028年金属压力容器市场现状与前景调研报告》是对当前金属压力容器行业的全面分析,旨在为相关企业和从业者提供决策支持。该报告详细探讨了行业监管环境、发展特性、市场趋势等多个关键方面。 首先,报告在...

    2023-2030年圆片瓷介电容器行业调研及前景趋势预测报告.pdf

    ### 2023-2030年圆片瓷介电容器行业调研及前景趋势预测报告 #### 一、圆片瓷介电容器行业概述与市场现状 **圆片瓷介电容器**是一种常见的被动电子元件,广泛应用于各种电子设备中。这类电容器通常具有体积小、可靠...

    行业分类-设备装置-带点状凸起的纸浆模塑容器盖及其加工方法和热压模具.zip

    《行业分类-设备装置-带点状凸起的纸浆模塑容器盖及其加工方法和热压模具》 本文将深入探讨一种创新的工业技术,即带点状凸起的纸浆模塑容器盖的制造工艺,以及与之相关的热压模具设计。这种技术在环保包装领域具有...

    2024年中国不锈钢保温容器行业市场竞争模式及投资前景研究报告.pptx

    【中国不锈钢保温容器行业概述】 中国不锈钢保温容器行业在...综上所述,中国不锈钢保温容器行业面临激烈的市场竞争,但同时也拥有广阔的发展前景。投资者需充分了解市场动态,制定合理投资策略,以把握行业发展机遇。

    行业分类-设备装置-带点状凸起的纸浆模塑容器盖及其热压模具.zip

    《行业分类-设备装置-带点状凸起的纸浆模塑容器盖及其热压模具》 本主题涉及的是一个具体的技术领域,即纸浆模塑行业中的创新设计——带点状凸起的纸浆模塑容器盖及其制造过程中使用的热压模具。这种设计和工艺在...

    行业分类-设备装置-纸容器自动成型机的压模成型装置.zip

    随着消费者对环保包装需求的增长,这类设备的市场前景十分广阔。同时,随着科技的进步,压模成型装置也在不断优化,如引入智能控制技术,提高生产效率,减少能源消耗,以满足日益严格的环保标准和企业的经济效益需求...

    2021-2025年中国压力容器设备行业基于产业变化研究与战略决策咨询报告.pdf

    报告通过对压力容器设备行业的深入研究,提出了行业的发展前景和趋势预测,强调了面对变化时,选择和决策的重要性,并借鉴了马云关于变化的观点,指出变化是不可避免的,拥抱变化是企业发展的必由之路。 综合上述...

    行业分类-设备装置-多层纸容器.zip

    这份文档可能涵盖了设备的工作原理、维护指南、生产工艺优化建议,甚至包括行业趋势和市场前景的分析。对于从事这个领域的专业人士,深入理解这些内容将有助于提升生产效率,降低废品率,并确保产品质量符合客户需求...

    行业分类-设备装置-模塑原纸和由其生产的模塑纸容器.zip

    随着消费者对环保意识的提升,这一领域的市场前景广阔,企业需要不断研发创新,提升产品的环保性能和技术含量,以应对日益严格的环保法规和市场竞争。 总的来说,模塑原纸和模塑纸容器的生产和应用是现代包装行业中...

    行业分类-外包设计-竹片成型的包装容器的介绍分析.rar

    同时,随着消费者对环保意识的提高,愿意为环保产品支付溢价的人群也在不断扩大,这使得竹片包装容器具有良好的市场前景。 总结来说,竹片成型的包装容器是一种兼顾环保、美观和实用性的设计选择。它体现了人类对可...

    2023年玻璃保温容器及其玻璃胆行业洞察报告及未来五至十年预测分析报告.docx

    三、玻璃保温容器及其玻璃胆产业的未来发展前景 1. 市场规模预测:预计未来几年中国玻璃保温容器及其玻璃胆行业将持续扩大,市场规模有望进一步增长。 2. 大规模推广应用:随着消费者对健康生活品质追求的提高,...

    压力容器年度检验中Excel数据处理功能的应用.pdf

    在化工行业中,压力容器作为特种设备,每年都需要按照国家规定进行检查,并出具相应的...同时,文章也反映出技术人员在进行压力容器年度检查时,对于数据准确性和工作效率的追求,以及Excel在化工行业中的应用前景。

    行业分类-外包设计-由柔韧的编织材料生产编织片段以及生产包装容器的方法的介绍分析.rar

    《行业分类-外包设计-由柔韧的编织材料...在环保理念日益重要的今天,这种可持续发展的生产方式无疑具有广阔的市场前景。通过学习和实践这些方法,企业不仅可以提升产品品质,还能在包装设计上打造出独特的品牌标识。

    C#常用控件

    * ForeColor 属性:获取或设置窗体的前景色 * IsMdiChild 属性:获取或设置窗体是否为多文档界面(MDI)子窗体 * IsMdiContainer 属性:获取或设置窗体是否为多文档界面(MDI)子窗体的容器 * KeyPreview 属性:获取...

    HTML-embed代码详解

    通过使用 bgcolor 和 fgcolor 属性,可以设置音频或视频文件的前景色和背景色。 HTML-embed 代码提供了多种方式来控制音频或视频文件的播放、循环、音量大小、面板显示、开始时间、容器属性、容器单位、外观设置、...

    Java语言编程-GUI编程.pdf

    如果某个组件的前景色、背景色或字体属性没有被显式设置,这些属性将采用其所在容器的对应属性作为默认值。 在GUI中,组件的位置和大小通常由布局管理器(LayoutManager)决定。布局管理器负责确定组件的尺寸和位置...

    oc电子书翻页背景色统一效果

    "oc电子书翻页背景色统一效果"项目提供了一种解决方案,通过使用Objective-C(OC)编程语言,为iOS应用实现逼真的双面页面翻转效果,并确保前景色与背景色的协调统一。下面我们将深入探讨这一技术实现的关键知识点。...

    行业文档-设计装置-内外层组合式纸浆模塑容器.zip

    总结,内外层组合式纸浆模塑容器是一种结合了环保、实用和美观的包装设计,不仅符合当前绿色包装的需求,还具有广阔的发展前景。通过深入理解其制作工艺和设计特点,我们可以更好地推广和应用这种可持续的包装解决...

    Swing页面属性的设置顺序

    例如,如果你先设置了组件的背景色,然后又设置了前景色,那么前一个设置可能会被后一个覆盖。因此,合理的设置顺序能确保我们期望的效果得以实现。 博文链接中的内容可能详细探讨了Swing组件属性设置的一些实践...

Global site tag (gtag.js) - Google Analytics