Selector使用

Selector使用

Selector使其能够在不同的状态下更换某个View的背景图片。

<?xml version="1.0" encoding="utf-8" ?>     
<selector xmlns:android="http://schemas.android.com/apk/res/android">   
  <!-- 触摸时并且当前窗口处于交互状态 -->    
  <item android:state_pressed="true" android:state_window_focused="true" android:drawable= "@drawable/pic1" />  
  <!--  触摸时并且没有获得焦点状态 -->    
  <item android:state_pressed="true" android:state_focused="false" android:drawable="@drawable/pic2" />    
  <!--选中时的图片背景-->    
  <item android:state_selected="true" android:drawable="@drawable/pic3" />     
  <!--获得焦点时的图片背景-->    
  <item android:state_focused="true" android:drawable="@drawable/pic4" />    
  <!-- 窗口没有处于交互时的背景图片 -->    
  <item android:drawable="@drawable/pic5" />   
</selector>

Selector最终会被Android框架解析成StateListDrawable类对象。

  1. StateListDrawable类介绍 该类定义了不同状态值下与之对应的图片资源,即我们可以利用该类保存多种状态值,多种图片资源。 方法:
    • public void addState (int[] stateSet, Drawable drawable) 功能: 给特定的状态集合设置drawable图片资源
//初始化一个空对象  
StateListDrawable stalistDrawable = new StateListDrawable();  
//获取对应的属性值 Android框架自带的属性 attr  
int pressed = android.R.attr.state_pressed;  
int window_focused = android.R.attr.state_window_focused;  
int focused = android.R.attr.state_focused;  
int selected = android.R.attr.state_selected;  
  
stalistDrawable.addState(new int []{pressed , window_focused}, getResources().getDrawable(R.drawable.pic1));  
stalistDrawable.addState(new int []{pressed , -focused}, getResources().getDrawable(R.drawable.pic2);  
stalistDrawable.addState(new int []{selected }, getResources().getDrawable(R.drawable.pic3);  
stalistDrawable.addState(new int []{focused }, getResources().getDrawable(R.drawable.pic4);  
//没有任何状态时显示的图片,我们给它设置我空集合  
stalistDrawable.addState(new int []{}, getResources().getDrawable(R.drawable.pic5);  
上面的“-”负号表示对应的属性值为 false
当我们为某个View使用其作为背景色时,会根据状态进行背景图的转换。
  • public boolean isStateful () 功能: 表明该状态改变了,对应的drawable图片是否会改变。 注:在StateListDrawable类中,该方法返回为true,显然状态改变后,我们的图片会跟着改变。
  1. GridView之Selector使用: GridView在点击每一个条目的时候黄色的背景,很难看,那么怎么才能让其不显示这个颜色呢?就是在GridView中将listSelector这个属性指定为透明的, 这样再点击的时候就不显示黄色了,但是这样用户不知道自己点击了没有,所以要让它在点击的时候显示一个我们自定义的颜色
<GridView
    android:listSelector="@android:color/transparent"//listSelector用于标示当前的条目被选择的时候的状态
    android:id="@+id/gv_home"
    android:verticalSpacing="10dip"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:numColumns="3" >
</GridView>
``` 
1. drawable目录新建xml文件
	```xml
	<?xml version="1.0" encoding="utf-8"?>
	<selector xmlns:android="http://schemas.android.com/apk/res/android">
		<item android:state_pressed="true"
			  android:drawable="@color/gray" /> <!-- 点击的时候显示的背景 -->
		<item android:state_focused="true"
			  android:drawable="@color/gray" /> <!-- 获取焦点的时候显示的背景 -->
		<item android:state_hovered="true"
			  android:drawable="@drawable/button_focused" /> <!-- hovered -->
		<item android:drawable="@android:color/transparent" /> <!-- 平常状态显示的颜色 -->
	</selector>
	```	
*这里android:drawable="@color/gray"必须通过将颜色放到res下的color.xml中然后通过@color/gray这种方式指定而不能通过#000000这样直接写颜色,如果直接写颜色会报错*
2. 在控件中通过背景使用这个状态选择器 		
    对每个GridView的子条目设置相应的背景为改状态选择器
    ```xml
	<?xml version="1.0" encoding="utf-8"?>
	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:gravity="center_horizontal"
		android:background="@drawable/gv_item_selector"
		android:orientation="vertical" >
		<ImageView
			android:id="@+id/iv_home_item_icon"
			android:layout_width="60dip"
			android:layout_height="60dip"
			android:scaleType="fitXY"  //scaleType是指定图片的缩放类型, fitXY就是填充x和y轴
			android:src="@drawable/safe" />
		<TextView
			android:id="@+id/tv_home_item_name"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:text="手机防盗"
			android:textSize="18sp"
			android:textColor="#000000" />
	</LinearLayout>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏分享达人秀

自定义ProgressBar打造酷炫进度条

Android系统默认的ProgressBar往往都不能满足实际开发需要,一般都会开发者自定义ProgressBar。 在Android开发中,...

1.3K50
来自专栏Sorrower的专栏

界面无小事(六):来做个好看得侧拉菜单!

13620
来自专栏分享达人秀

ToggleButton和Switch使用大全

上期学习了CheckBox和RadioButton,那么本期来学习Button的另外两个子控件ToggleButton和Switch,在开发中同样比较重...

40050
来自专栏学海无涯

Android开发之SwipeRefreshLayout实现下拉刷新

简介 SwipeRefreshLayout是Google官方推出的一款下拉刷新组件,位于v4兼容包下,android.support.v4.widget.Swi...

34140
来自专栏跟着阿笨一起玩NET

c# 模拟window 操作鼠标|winapi

适合场景:LinkButton如果想要弹出右键菜单的时候,可以在Click事件中通过API模拟鼠标右击事件。

23410
来自专栏我就是马云飞

无需自定义View,彻底解放shape,selector吧

作为一个android程序员,对于shape、selector这两个标签一定不陌生。每当UI设计师给我们设计出一个个button背景的时候,我们就需要去draw...

11520
来自专栏飞雪无情的博客

Android TextView小组件的使用--附带超链接和跑马灯效果

然后运行该应用就可以看到TextView的效果,是显示一行字:“Hello World, HelloTextView!”,这是因为新建的Hello项目自带的一个...

11150
来自专栏分享达人秀

两分钟掌握数值选择器NumberPicker

上一期学习了日期选择器DatePicker和时间选择器TimePicker,是不是感觉非常简单,本期继续来学习数值选择器NumberPicker 。 一...

23660
来自专栏向治洪

关于Android PullTorefreshScrollview回到顶部实例

列表滑动下面显示按钮,点击按钮回到顶部的功能,一般scrollview会有滑动监听的事件,通过setOnScrollChangeListener()滑动监听滑动...

22690
来自专栏一直在跳坑然后爬坑

环形布局CircleLayout效果图用法链接

1.可以直接在布局文件中进行布局,类似LinearLayout,但是这里不需要关心布局方式,会自动将布局中的所有子view均匀分布到中心点四周,这里你可以设置自...

22620

扫码关注云+社区

领取腾讯云代金券