菜鸟日记:
看别人家写的开关按钮控件有滑动效果,感觉很炫酷。在网上找了下其实在SDK4.0版本及其以上,可以通过样式文件可以给switck...等标签配置样式属性可以达到相近的效果。SDK 4.0一下也可以通过代码自定视图控件实现---就是继承View及其子类来自定义一个属于自己的控件。所以自己去网上GitHub找了一个Demo《SwitchButton 实现了类似 IOS上的 SwitchButton 支持滑动和动画》。真心感觉别人家的东西就是好。所以在空闲的时间自己也学着些这编博文了(高手勿喷^_^)。之所以写出来:为己用也便于同样困惑的朋友一起学习。
声明:全部内容摘自互联网
/**
* 完全自定义视图控件
*
* 创建自定义视图组件的一个概要性的总体描述:
* 1.扩展一个现有的视图类然后子类化它。 (继承View类或其子类)
* 2.重写父类中的一些方法。这些方法以“on”开始,比如onDraw(), onMeasure(),和 onKeyDown()。
* 这和活动或列表活动中为生命周期和其他功能钩子重写on…事件类似。
* 提示: 同样,你也可以重写父类的一些功能性的方法
* 3.使用你的新扩展类。这些完成后,你的扩展类就可以替代那个基础视图了。
*
* @author xxx Zhang
* 参考博文:
* http://ming-fanglin.iteye.com/blog/1396723
* http://blog.csdn.net/iefreer/article/details/4598932
* http://blog.csdn.net/qinjuning/article/details/6936783
*/
第一步:创建一个类(mView01) 继承 View
public class mView01 extends View {
//编译器会提示:必须写一个构造器方法
}
android.view类是其他视图控件(TextView,Botton...)的父类。他们同样也继承了View的一些函数方法。
第二步:实现构造器
<span style="white-space:pre"> </span>/**构造器*/
public mView01(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);//调用父类的构造器
//接收构造参数
this.context=context;
//initView(context);//资源初始化方法
}
/**在XML布局文件中实列化这个构造器*/
public mView01(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.checkboxStyle);
}
/**在代码中调用这个实列的构造器*/
public mView01(Context context) {
this(context, null);
}
注:关于构造器你自己也可以根据自己的需求添加。但是必须要调用父类的构造器对象。之所以说是必须:我想同样View类在定义的时候也继承或实现了一些别的类
第三步:重写父类(View)中的一些方法
1>onMeasure(int widthMeasureSpec, int heightMeasureSpec)
Measure:英文是测量的意思。
这方法主要是提供绘制一个视图的大小尺寸函数。在这个函数里你要告诉父类视图/控件要加载自定义的的尺寸-----setMeasuredDimension(measuredHeight, measuredWidth);
需要注意的:onMeasure()的参数是系统默认提供一个100*100的尺寸。在实际开发中你可以重新设置H*W2>onDraw(Canvas canvas)
Draw:英文是绘制的意思。
这个方法执行画笔功能,参数是画布对象。你可以在画布上绘制你需要的内容,可以是:图形、位图、文字...比如:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/* 画布(图层),有点类似Ps画图工具的意思,缺省设置系统系统默认的*/
canvas.drawColor(Color.GRAY);//灰色
/*画一个Circle(空心圆形)*/
canvas.drawCircle(40, 40, 30, mPaint);//x,y,半径,画笔
}
根据你自定义的需求用参数 canvas就可以绘制你的需求。你可以查看文档看看:Canvas类android.graphics.Canvas
Canvas使用详情:http://blog.csdn.net/qinjuning/article/details/6936783
绘制2D图形:http://www.cnblogs.com/stulife/archive/2010/08/19/1803313.html
如果你自定义的内容比较复杂,有多个图层需要叠加。那么你需要设置 Paint:画笔
//处理两张图层的处理模式:
//参考:http://trylovecatch.iteye.com/blog/1189452
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
-------------------------------------------------------------------------------------
如果你以及根据自定义的需求绘制了一个你需要的图层内容。那么在这里你需要了解关于:画布的保存和回滚事务 参考百度
/*为了方便一些转换操作,Canvas提供了保存和回滚属性的方法(save和restore)*/
所以你最好是在绘制具体内容是:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/*为了方便一些转换操作,Canvas提供了保存和回滚属性的方法(save和restore)*/
canvas.save();
/*
//画布(图层),有点类似Ps画图工具的意思,缺省设置系统系统默认的
canvas.drawColor(Color.GRAY);//灰色
//画一个Circle(空心圆形)
canvas.drawCircle(40, 40, 30, mPaint);//x,y,半径,画笔
*/
//回滚:回到上一个save调用之前的状态,如果restore调用的次数大于save方法,会出错。
canvas.restore();
}
重构了上面父类onXX()函数基本上你可以调用这个自定义的视图控件了。如果你希望对这个控件添加一些监听事件那么你可以继续重些父类的一些onXX()函数:
onKeyUp(int, KeyEvent) :当一个按键释放事件发生时,调用此方法
onMotionEvent(MotionEvent): 当一个动作事件(如触摸)发生时,调用此方法
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.i(TAG, "//onKeyDown");
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//屏幕获得焦点(按下)
mPaint.setColor(Color.GREEN);//绿色
break;
case MotionEvent.ACTION_MOVE:
//屏幕焦点移动(滑动)
break;
case MotionEvent.ACTION_UP:
//屏幕失去焦点(松开)
mPaint.setColor(Color.RED);
break;
}
invalidate();//请求重绘View树,即onDraw()过程
return super.onTouchEvent(event);
}
至此,对完全自定义视图控件有一个简单的理解。
---------------------------------------
获取你在纠结怎么去实现这个自定义的视图控件类:
public class ViewA01 extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflate = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout layout = (LinearLayout)inflate.inflate(R.layout.activity_view, null);//加载xml
setContentView(layout);//ACTIVITY加载视图层次结构
/*自定义视图控件实列化,方式1:用标签实现用代码创建视图控件*/
mView01 mTextView = new mView01(this);
layout.addView(mTextView);//在布局文件中添加这个视图控件
}
}
<!-- 自定义视图控件实列化,方式2:用标签实现 -->
<com.my.view.util.mView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />