Android自定义控件

自定义控件对于新手来说用画笔来做是不是觉得很难蛋疼呢?今天就给大家发福利了!我们不用画笔自定义进度条做一个山寨迅雷下载进度条。(其他某些控件也可)来,代码加注释

先上图:看看我们的效果:

点击下面的按钮:中间进度条正在下载

Android自定义控件_第1张图片Android自定义控件_第2张图片


好了,先布局吧


    
    
	
	
    
	
        android:progressDrawable="@drawable/newbar" />

    



 
   

重点来了,怎么设置进度条的属性呢?

我们想要改变系统控件的一些属性是不是通过在XML或者在代码中给控件设置你想要的属性呢?如果效果在复杂一点我们就会用到style或者anim了是不是?所以,我们可以通过修改ProgressBar的style来改变它的模样!那我们怎么去找到ProgressBar的style呢?

      1:进入你的adt目录下,Ctrl+f  搜索 styles.xml 这时系统定义的所有style都在这了
2:Ctrl+f  搜索 styles.xml   再加一个关键字ProgressBar这时就定位到一个XML
3:先把它拖进Eclipse看看,在Eclipse Ctrl+f  搜索 ProgressBar
Android自定义控件_第3张图片
看到系统给我们定义的属性了吗?
现在重点来了,我们迅雷ProgressBar要修改什么属性呢?
1:两种颜色:一是蓝色,二是背景色白色
2:把方向改变,从水平改为垂直
3:形状修改为圆形
那到底是哪个呢?是  Widget.ProgressBar.Horizontal这个属性里面的Android自定义控件_第4张图片
我们按着Ctrl 鼠标指向红色标注的地方单击进去------>




    
    
        
            
            
        
    
    
    
        
            
                
                
            
        
    
    
    
        
            
                
                
            
        
    
    


这个就是ProgressBar的属性了。当然我们不可以直接在里面改。我们在res下新建一个drawable的file
创建一个newbar.xml 选择layer-list,因为要跟系统文件里的属性一致
Android自定义控件_第5张图片

把系统文件layer-list里面的item全部拷贝进去进行修改




    
        
            
            
            
                android:width="1dp"
                
                android:color="@android:color/white" />
			
            
                android:angle="90"
                android:centerColor="#f0f3f5"
                android:centerX="75"
                android:endColor="#f0f3f5"
                android:startColor="#f0f3f5" />
        
    
    
        
            
                

                

                
            
        
    
    
        
            
                

                

                
                    android:centerColor="#3f82c3"
                    android:centerX="75"
                    android:endColor="#3f82c3"
                    android:startColor="#3f82c3" />
            
        
    


重要的 地方已经写了注释,其他的不同自己对照,现在回到上面第一个布局文件,
  android:progressDrawable="@drawable/newbar" 是不是就明白了呢?
还有就是,我的进度条宽高设置为了80dp,是为什么呢?因为我的圆角设置为了40dp
这样它们显示出来的就是圆了.....是两倍关系哦,你想要其他形状就自己决定吧
这样我们的进度条已经ok了。

现在来自定义控件---在class中绑定
package com.xuleibar.tool;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.gwl.xunleibar.R;

public class XunLeiBar extends LinearLayout{

	private ProgressBar mPb;
	private TextView mTv;
	//重写第二个构造方法
	public XunLeiBar(Context context, AttributeSet attrs) {
		super(context, attrs);
		//找到布局文件,找到id
		LayoutInflater.from(context).inflate(R.layout.xunleibar_tool, this, true);
		mPb = (ProgressBar) findViewById(R.id.xuleibar);
		mTv = (TextView) findViewById(R.id.xuleitxt);
		
	}
	//自定义setProgress方法,使得文本与进度条同步
	public void setProgress(int size) {

		mPb.setProgress(size);
		mTv.setText(size+"%");
	}
	
	//自定义setTextColor方法,改变字体颜色
public void setTextColor(int color){mTv.setTextColor(color);}}

这样就做好了自定义控件
接下来就在主界面实现它们吧!------->
主界面的布局不做详解了,自己看


    

 
	
    


主Activity里的代码:
package com.gwl.xunleibar;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

import com.xuleibar.tool.XunLeiBar;


public class MainActivity extends Activity {

	XunLeiBar mXl;
	ImageButton mbtn;

	//实现线程间通信
	@SuppressLint("HandlerLeak")
	Handler mHandler = new Handler() {
		@SuppressLint({ "ResourceAsColor", "InlinedApi" }) 
		public void handleMessage(Message msg) {
			//更新进度条的进度
			mXl.setProgress(msg.arg1);
//			if (msg.arg1 >= 50) {
//				mXl.setTextColor(android.R.color.white);
//			}else{
//				mXl.setTextColor(android.R.color.holo_blue_light);
//			}

		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mXl = (XunLeiBar) findViewById(R.id.xlbar_main);
		mbtn = (ImageButton) findViewById(R.id.btn_main);
		//按钮的点击事件
		mbtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				//创建线程
				new Thread(new Runnable() {
					@Override
					public void run() {
						//每过0.1秒发一次数据,模拟下载
						int i = 0;
						while (i < 100) {
							i = i + 2;
							try {
								Thread.sleep(100);
								Message msg = mHandler.obtainMessage();
								msg.arg1 = i;
								msg.sendToTarget();
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
					}
				}).start();
			}
		});

	}


}

我的按钮比较好看也是自定义过的。在此就不再说了。
程序跑起---------------------------->



你可能感兴趣的:(Andrioid)