zoukankan      html  css  js  c++  java
  • Android控件在点击、选择时背景变化(button、listview)

    用户行为的变化,界面上的行为也要随之变化,比如用户点击、选择等。如果使用按钮,没有添入背景图片,按钮在点击时会有变化。但如果增加了背景图,点击时则没有变化了,除非动态的改变背景图。用户的行为不断变化,如果每次都是通过代码去控制背景的变化,虽然可以达到,但不好控制。那有没有更好的办法呢?

    有的。

    可以通过自定义的xml作为背景图实现。先看一下效果图。



    点击按钮时,背景变成了黄色,松开后,又变回到了原来的颜色。ListView中的项也是如此。

    下面看具体的实现。

    1.自定义背景

    click_total.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:drawable="@drawable/button_total_click" android:state_pressed="true"/>
        <item android:drawable="@drawable/button_total_click" android:state_focused="true"/>
        <item android:drawable="@drawable/button_total_click" android:state_selected="true"/>
        <item android:drawable="@drawable/button_total"/>
    
    </selector>

    click_list_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:drawable="@color/yellow" android:state_pressed="true"/>
        <item android:drawable="@color/yellow" android:state_focused="true"/>
        <item android:drawable="@color/yellow" android:state_selected="true"/>
        <item android:drawable="@android:color/white"/>
    
    </selector>
    注:

    (1).XML中定义了一个选择器selector。在选择器中定义了不同的项,以响应不同的操作。比如在click_totl.xml中state_pressed是表示按下的状态,对应的drawable变成了button_total_click,正常是button_total.这里的drawble使用的是图片。除了使用图片外,还可以直接使用颜色。比如在click_list_item中使用的是yellow和white.

    (2).color/yellow是自定义的颜色。代码如下。

    clolors.xml

    <resources>
    
        <color name="gray">#E8E8E8</color>
        <color name="yellow">#F88B00</color>
    
    </resources>
    2.控件布局

    main_activity.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/click_total"
            android:text="@string/hello_world" />
    
        <ListView
            android:id="@+id/list"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
    
        </ListView>
    
    </LinearLayout>
    注:

    (1).button中直接设置了backgroud为click_total.

    (2).listview只是定义了一个控件,具体的内容需要在adapter中添加。代码如下。

    DatasAdapter.java

    package com.example.cbc;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    
    import android.content.Context;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    public class DatasAdapter extends BaseAdapter {
    
    	private List<String> _datas = null;
    	private Context _context = null;
    
    	public DatasAdapter(Context context) {
    		_context = context;
    		Init();
    	}
    
    	private void Init() {
    		_datas = new ArrayList<String>();
    		for (int i = 0; i < 20; i++) {
    			_datas.add("[" +i+ "]"+ UUID.randomUUID().toString().substring(0, 10));
    		}
    	}
    
    	@Override
    	public int getCount() {
    
    		return _datas.size();
    	}
    
    	@Override
    	public Object getItem(int position) {
    
    		return _datas.get(position);
    	}
    
    	@Override
    	public long getItemId(int position) {
    
    		return position;
    	}
    
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    
    		TextView textView =null;
    		
    		if (convertView == null) {
    			textView =new TextView(_context);
    		}
    		else
    		{
    			textView=(TextView)convertView;
    		}
    		
    		textView.setText(_datas.get(position));
    		textView.setTextSize(30);
    		textView.setBackgroundResource(R.drawable.click_list_item);
    
    		return textView;
    	}
    
    }
    
    注:

    (1).初始化一个datas的list。

    (2).在getView中新建一个textView,将其背景设置为click_list_item.

    (3).通过convertView是否为null判断TextView是否已经存在,以免不断新建浪费资源。

    3.Activity实现

    MainActivity.java

    package com.example.cbc;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ListView;
    
    public class MainActivity extends Activity {
    
    	private ListView _datas_listView=null;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main_activity);
    		Init();
    	}
    
    	private void Init() {
    		FetchUIControls();
    		InitParams();
    	}
    
    
    	private void FetchUIControls() {
    		_datas_listView=(ListView)findViewById(R.id.list);
    		
    	}
    	 
    	private void InitParams() {
    		DatasAdapter datasAdapter=new DatasAdapter(this);
    		_datas_listView.setAdapter(datasAdapter);
    		
    	}
    	
    	
    }
    
    最后附上button_total和button_total_click的图片


    转载请注明出处:http://blog.csdn.net/xxdddail/article/details/22910481


  • 相关阅读:
    高级特性(4)- 数据库编程
    UVA Jin Ge Jin Qu hao 12563
    UVA 116 Unidirectional TSP
    HDU 2224 The shortest path
    poj 2677 Tour
    【算法学习】双调欧几里得旅行商问题(动态规划)
    南洋理工大学 ACM 在线评测系统 矩形嵌套
    UVA The Tower of Babylon
    uva A Spy in the Metro(洛谷 P2583 地铁间谍)
    洛谷 P1095 守望者的逃离
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605012.html
Copyright © 2011-2022 走看看