layout方法的简单使用案例

layout代表着某一个view在父view中的位置,比如

ViewGroup parent = new ViewGroup();

View child = new View();

parent.addView(child)

child.layout(l,t,r,b);

ps:用new 来初始化对象只是为了方便说明情况

此时child是parent的子View,child.layout(l,t,r,b)就说明了child在parent放置的坐标位置,坐标原点(0,0)就是parent的左上角。

其中(l,t)代表着左上角的位置,(r,b)代表着右下角的位置。

使用案例,如下这个页面:该页面有多个view可以获取焦点,并在获取到焦点的view上赋予一个焦点框。

刚开始实现这个页面的时候使用切图的方法,也就是把每个view的焦点框切一个图,放在

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <!--focus_img:焦点框图片-->
    <item android:state_focused="true" android:drawable="@drawable/focused_img"/>
    <item android:state_selected="true" android:drawable="@drawable/focused_img"/>
    <item android:state_pressed="true" android:drawable="@drawable/focused_img"></item>
    <item android:drawable="@drawable/unfocused_img"/>
</selector>

这中配置文件来让一个设置一个view的background.但是这样做有一个问题:这个页面有几个不同大小的view需要焦点框效果。也就是说要让美工针对不同的view来切不同的焦点框。要知道这只是应用的一个界面,还有其他的页面同样需要获取焦点框,那么就还得让美工切图。这样的话就得为每个焦点框配置一个selector这种重复性的工作。

下面就用另外一种方法来,该是layout出场的时候了:

思路:

1)提供一个.9图片的焦点框

2)提供一个ImageView,这个ImageView的src就是.9图片,假设该ImageView的变量名为focusImgView

3)对页面focusable为true的view设置FoncusChangeListener,如果某个view获取焦点的话,获取该view的左上角的位置(x,y)和它的宽度(width,height).然后设置

focusImgView.layout(x,y,x+width,y+height)(因为android中没有直接的方法来获取某个view右下角的位置,所以需要通过宽和高来计算之)

基本的代码如下:

/**焦点框View**/
public class FocusView extends ViewGroup{
    /**焦点框**/
	private ImageView focusImgView;
	/**页面中获取焦点的view**/
	private View focusView;
	/*焦点.9图片*/
	private Drawable mViewFocusDrawable;
	public FocusView(Context context,Drawable mViewFocusDrawable) {
		super(context);
		init(mViewFocusDrawable);
	}

	private void init(Drawable mViewFocusDrawable) {
		focusImgView = new  ImageView(getContext());
		ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
		addView(focusImgView, params);
		focusImgView.setBackgroundDrawable(mViewFocusDrawable);
	}

	/**
	 * 设置焦点的图片
	 * @param d
	 */
	public void setFocusDrawable(Drawable mViewFocusDrawable) {
		focusImgView.setBackgroundDrawable(mViewFocusDrawable);
	}

	/*
	*@focusView 获取焦点的view
	*/
	public void showFocus(View focusView) {

		int[] location = new int[2];
		focusView.getLocationInWindow(location);
		int x = location[0];
		int y = location[1];
		int width = focusView.getWidth();
		int height = focusView.getHeight();
	        //这是重点步骤
		focusImgView.layout(x, y,x+ width,y + height);
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
	}

}
在onFoucusChange方法里面这么调用:
	@Override
	public void onFocusChange(View view, boolean hasfocus) {

		int viewId = view.getId();
		switch (viewId) {
		case R.id.demo_btn:
			if (hasfocus) {
				mFocusView.showFocus(view);
			}
			break;
		}
	}

这样一个简单的.9图片就能够满足页面的应用

时间: 2024-11-13 05:52:47

layout方法的简单使用案例的相关文章

Android的onLayout、layout方法讲解

http://www.2cto.com/kf/201404/291740.html onLayout方法是ViewGroup中子View的布局方法,用于放置子View的位置.放置子View很简单,只需在重写onLayout方法, 然后获取子View的实例,调用子View的layout方法实现布局.在实际开发中,一般要配合onMeasure测量方法一起使用. onLayout方法: ? 1 2 3 @Override protected abstract void onLayout(boolean

【初学菜鸟作--邮件服务的简单配置案例】

邮件服务器的配置以及使用 实验一:                    实验目的:简单搭建出邮件服务器并测试其可用性                    实验环境:DNS服务器一台,安装有Portfix的邮件服务器一台 实验步骤: 一.邮件的发送(SMTP) 1.在邮件服务器配置主机名,ip,并安装portfix并启动 [[email protected]~]# tail -2 /etc/sysconfig/network HOSTNAME=mail.tarena.com   [[email

解析xml几个方法的简单封装

import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; /** * * @author D_xiao * */ public class AnalysisXmlByDom { /** * 功能 :通过dom的方法解析

浅析 抽象工厂、工厂方法、简单(静态)工厂

----简单工厂 (也叫静态工厂模式):一个抽象产品抽象出多个具体产品类,一个具体工厂类 代码: //抽象产品角色 public interface Car{ public void drive(); } //具体产品角色 public class Benz implements Car{ public void drive() { System.out.println("Driving Benz "); } } public class Bmw implements Car{ pub

扩展方法从简单应用到深入解析,读这一篇文章就够了

前言(扯淡-_-) 大家好,今天和大家聊聊扩展的事,我将带着大家从简单应用开始深入理解扩展方法的原理,并对扩展方法的使用给出合理的建议. 在实际应用中,当我们在使用某类时发现类中缺少我们想要的方法,最简单直接的就是修改类的源代码来添加我们想要的方法.但事实往往不如人意,总会因为各种因素不可以直接修改源码:拿不到源码.不允许修改,这时候通过继承并扩展的方式来复用是再好不过了,但是如果连最后的继承的权利都剥夺的话(密封类不允许继承)?...这时候就需要用到[扩展方法]了. 扩展方法简介 我们先来看看

IDA 调试 Android 方法及简单的脱壳实现

IDA 调试 Android 方法及简单的脱壳实现 标签: android原创逆向调试dalvik 2016-05-24 14:24 9286人阅读 评论(3) 收藏 举报 分类: 原创(25) Android(5) 学习(9) 逆向(4) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 本文参考了一些网络文章,对大大们的技术分享表示感谢.小弟刚刚开始深入去搞Android的逆向不久,写一下学习笔记,希望能抛砖引玉,给新手同学们带来方便.文笔比较烂,这不重要,重要的是按自

Sharepoint构建轻量型应用之InfoPath的简单应用案例!

1.   很遗憾,在office 2016 版本中已经将表单功能移除,office 2013 版本已经成了infopath 绝唱,所以我们必须安装office 2013 版本的office Professional plus来完成我们的表单组件安装: 2.   点开infopath Deisgner,我们可以看到可以创建的组件: 3.   这里我们可以创建多种表单,我们这次做一个简单的案例,建立一个标准的空白表单后点击设计后进入到相应的表单设计界面,我们先设计好整个页面的布局: 4.   基于简

_00019 Storm的体系结构介绍以及Storm入门案例(官网上的简单Java案例)

博文作者:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spark ... 云计算技术 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! qq交流群:214293307  (期待与你一起学习,共同进步) # Storm

原生JS取代一些JQuery方法的简单实现

原生JS取代一些JQuery方法的简单实现 下面小编就为大家带来一篇原生JS取代一些JQuery方法的简单实现.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.选取元素 // jQuery var els = $('.el'); // Native var els = document.querySelectorAll('.el'); // Shorthand var $ = function (el) { return document.querySelect