Android中自定义View和自定义动画

浏览:
字体:
发布时间:2013-12-12 14:51:05
来源:

Android FrameWork 层给我们提供了很多界面组件,但是在实际的商业开发中这些组件往往并不能完全满足我们的需求,这时候我们就需要自定义我们自己的视图和动画。

我们要重写系统的View就必须了解View的基本用法和结构,如下图所示是Android官方指导中的View结构图:

vcq9veLKzdXivuS7sL7NyOfPwsPmtcR4bWzOxLz+o6hMaW5hckxheW91dL7NysfSu7j2Vmlld0dyb3VwLFRleHRWaWV3vs3Kx9K7uPZWaWV3o6mhozwvcD4KPHA+PExpbmVhckxheW91dD48L3A+CjxwPjxUZXh0Vmlldz48L1RleHRWaWV3PjwvcD4KPHA+PExpbmVhckxheW91dD48L0xpbmVhckxheW91dD48L3A+CjxwPjwvTGluZWFyTGF5b3V0PjwvcD4KPHA+z8LD5sC0venJ3NK7z8JWaWV3us1WaWV3R3JvdXDW0LXEvLi49tbY0qq1xLe9t6g8L3A+CjxwPqOoMaOpb25EcmF3IDq75tbG19S8ujwvcD4KPHA+o6gyo6lvbkxheW91dDpWaWV31tCyvL7Wt6LJ+rjEseTKsbvhtffTw7TLt723qDwvcD4KPHA+o6gzo6lkaXNwYXRjaERyYXc608PT2r/Y1sbX01ZpZXe1xLvm1sa31reiPC9wPgo8cD6jqDSjqWRyYXdDaGlsZDrWsb3Tv9jWxr7fzOW1xNfTVmlldzwvcD4KPHA+INbY0LTSu7j2Vmlld7XEsr3W6Mjnz8KjujwvcD4KPHA+o6gxo6nQwr2o0ru49lZpZXfX08Dgo6yyosq1z9a5udTsPC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;">package com.example.testmyanimation;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.WindowManager;import android.view.animation.AccelerateInterpolator;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.LinearInterpolator;import android.view.animation.TranslateAnimation;import android.widget.Button;import android.widget.LinearLayout;import android.widget.LinearLayout.LayoutParams;public class MyButton extends Button{ private Context context; private LayoutParams params; public MyButton(Context context) { super(context); this.context = context; //setOnClickListener(this); // TODO Auto-generated constructor stub } public MyButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; //setOnClickListener(this); // TODO Auto-generated constructor stub } public MyButton(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; //setOnClickListener(this); // TODO Auto-generated constructor stub } /*@Override public void onClick(View v) { //加载动画资源 //final Animation anim = AnimationUtils.loadAnimation(context, R.anim.myanim); startAnimation(new MyAnimation()); System.out.println("我点了"); }*/ @Override public boolean onTouchEvent(MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN){ WindowManager windowManager = (WindowManager) getContext() .getSystemService(Context.WINDOW_SERVICE); int width = windowManager.getDefaultDisplay().getWidth(); int height = windowManager.getDefaultDisplay().getHeight(); float x = event.getRawX() - event.getX(); float y = event.getRawY() -event.getY(); //MyAnimation mAnimation = new MyAnimation(width - x , height - y, 1000); AnimationSet mAnimation=new AnimationSet(false); TranslateAnimation translateAnimationX=new TranslateAnimation(0, width - x, 0, 0); translateAnimationX.setInterpolator(new LinearInterpolator()); // translateAnimationX.setRepeatCount(200); TranslateAnimation translateAnimationY=new TranslateAnimation(0, 0, 0, height - y); translateAnimationY.setInterpolator(new AccelerateInterpolator()); // translateAnimationY.setRepeatCount(200); mAnimation.addAnimation(translateAnimationY); mAnimation.addAnimation(translateAnimationX); mAnimation.setDuration(500); mAnimation.setAnimationListener(new Animation.AnimationListener(){ @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub //LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20, 20); setLayoutParams(params); setBackgroundResource(R.drawable.ic_launcher); } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationStart(Animation animation) { params = (LayoutParams) getLayoutParams(); LinearLayout.LayoutParams layout_params = new LinearLayout.LayoutParams(20, 20); setLayoutParams(layout_params); setBackgroundResource(R.drawable.b1); }}); startAnimation(mAnimation); } return true; } }(2)在xml文件中使用如下:

			

下面来介绍一下Animation及重写Animation,在Android中使用Animation代表抽象的动画类,它包括如下几个子类:

(1)AlphaAnimation :透明度改变的动画。

(2)ScaleAnimation:大小缩放的动画。

(3)TranslateAnimation:位移变化的动画。

(4)RotateAnimation:旋转动画。

然而在实际项目中透明度、缩放、位移、旋转这几种动画并不能满足我们的需求,这时候就需要用到自定义动画,自定义动画需要继承Animation,并重写applyTransformation(float interpolatedTime, Transformation t)方法,该方法中的两个参数说明:

interpolatedTime:该参数代表了时间的进行程度(如:你设置的时间是1000ms, 那么interploatedTime就会从0开始一直到1)

Transformation:代表补间动画在不同时刻对图形或组建的变形程度。该对象中封装了一个Matrix对象,对它所包含的Matrix对象进行位移、倾斜、旋转等变换时,Transformation将会控制对应的图片或视图进行相应的变换。

为了控制图片或View进行三维空间的变换,还需要借助于Android提供的一个Camera类,该类是一个空间变换工具,作用有点类似于Matrix,提供了如下常用的方法。

getMatrix(Matrix matrix) :将Camera所做的变换应用到指定的maxtrix上

rotateX(float deg):将目标组件沿X轴旋转

rotateY(float deg)、rotateZ(float deg)

translate(float x, float y, float z):把目标组件在三维空间类进行位移变换。

applyToCanvas(Canvas canvas):把Camera所做的变换应用到Canvas上。

具体自定义实现如下:

package com.example.testmyanimation;import android.content.Context;import android.graphics.Camera;import android.graphics.Matrix;import android.util.AttributeSet;import android.view.animation.AccelerateDecelerateInterpolator;import android.view.animation.AccelerateInterpolator;import android.view.animation.Animation;import android.view.animation.Transformation;public class MyAnimation extends Animation{	private float moveX;	private float moveY;	private int duration;	private Camera camera = new Camera();	public MyAnimation(float moveX, float moveY, int duration) {		this.moveX = moveX;		this.moveY = moveY;		this.duration = duration;	}			public MyAnimation(Context context, AttributeSet attrs) {		super(context, attrs);	}	@Override	public void initialize(int width, int height, int parentWidth,			int parentHeight) {		super.initialize(width, height, parentWidth, parentHeight);		//设置动画的持续时间		setDuration(duration);		//设置动画结束后保留效果		setFillAfter(false);				//setRepeatCount(2);		//setRepeatMode(2);		//播放速度		setInterpolator(new MyInterprolator());	}		@Override	protected void applyTransformation(float interpolatedTime, Transformation t) {		camera.save();		camera.translate(0f + moveX * interpolatedTime,				0f - moveY * interpolatedTime, 				0f);		//camera.rotateY(360 * (interpolatedTime) * 2);		//camera.rotateX(360 * (interpolatedTime));		//camera.rotateZ(360 * (interpolatedTime));		Matrix matrix = t.getMatrix();		camera.getMatrix(matrix);		//matrix.preTranslate(-centerX, -centerY);		//matrix.postTranslate(centerX, centerY);		camera.restore();	}	}

>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();