其实微信摇一摇的效果不是特别难,主要就是一个加速感应器和动画效果的配合了。本篇代码实现了摇一摇的功能,但界面方面不是特别好看,同学们可以把本文的代码下载,无需导入任何图片就可使用了,因为ImageView 我直接设的背景色,没上图片,你懂的。下面就是代码了:

activity

package com.shake.activity;import com.shake.activity.R;import android.app.Activity;import android.graphics.Color;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Window;import android.view.ViewGroup.LayoutParams;import android.view.animation.Animation;import android.view.animation.Animation.AnimationListener;import android.view.animation.TranslateAnimation;import android.widget.ImageView;import android.widget.LinearLayout;public class ShakeActivity extends Activity implements SensorEventListener,AnimationListener{private SensorManager  sensorManager ;private Sensor sensor ;private Animation out_top_Annotation = null;//上半部退出动画private Animation out_bottom_Annotation = null;//下半部退出动画private Animation in_top_Annotation = null;//上半部进入动画private Animation in_bottom_Annotation = null;下半部进入动画private int duration = 450;//动画效果时常,可以自己设置,此处为0.45秒private ImageView imageView_top = null;private ImageView imageView_bottom = null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.main);    LayoutInflater inflater = LayoutInflater.from(this);LinearLayout ll = (LinearLayout) inflater.inflate(R.layout.main, null);sensorManager =  (SensorManager) getSystemService(SENSOR_SERVICE);sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);sensorManager.registerListener(this,sensor, SensorManager.SENSOR_DELAY_GAME);/** * 设置动画效果 */this.out_top_Annotation = new TranslateAnimation(0,0,0,-(float)getWindowManager().getDefaultDisplay().getHeight()/3);this.out_top_Annotation.setDuration(duration);this.out_bottom_Annotation = new TranslateAnimation(0,0,0,(float)getWindowManager().getDefaultDisplay().getHeight()/3);this.out_bottom_Annotation.setDuration(duration);this.in_top_Annotation = new TranslateAnimation(0,0,-(float)getWindowManager().getDefaultDisplay().getHeight()/3,0);this.in_top_Annotation.setDuration(duration);this.in_bottom_Annotation = new TranslateAnimation(0,0,(float)getWindowManager().getDefaultDisplay().getHeight()/3,0);this.in_bottom_Annotation.setDuration(duration);this.out_bottom_Annotation.setAnimationListener(this);this.in_bottom_Annotation.setAnimationListener(this);/** * 新建两个ImageView用于展示摇的效果 */this.imageView_top = new ImageView(this);this.imageView_top.setLayoutParams(new LayoutParams(getWindowManager().getDefaultDisplay().getWidth(),getWindowManager().getDefaultDisplay().getHeight()/2));this.imageView_bottom = new ImageView(this);this.imageView_bottom.setLayoutParams(new LayoutParams(getWindowManager().getDefaultDisplay().getWidth(),getWindowManager().getDefaultDisplay().getHeight()/2));this.imageView_top.setBackgroundColor(Color.BLUE);//设置上半部分背景色,实际中用图来表示this.imageView_bottom.setBackgroundColor(Color.RED);//设置下班部分背景,实际中用图来表示//实际应用中上半部分和下半部分是一张图切成两部分的ll.addView(imageView_top);ll.addView(imageView_bottom);setContentView(ll);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}@Overridepublic void onSensorChanged(SensorEvent event) {float x = event.values[SensorManager.DATA_X];float y = event.values[SensorManager.DATA_Y];float z = event.values[SensorManager.DATA_Z];if(Math.abs(x)>=14||Math.abs(y)>=14||Math.abs(z)>=14){//判断加速度>14时,这个值是可以修改的。imageView_bottom.startAnimation(out_bottom_Annotation);//开始动画,记住是startAnimation,不是setAnimationimageView_top.startAnimation(out_top_Annotation);sensorManager.unregisterListener(this);//取消监听加速感应器,如果不取消的话会有问题,同学们可以自己去掉,狂摇试试}}@Overridepublic void onAnimationEnd(Animation animation) {// TODO Auto-generated method stubif(animation == this.out_bottom_Annotation){imageView_bottom.startAnimation(in_bottom_Annotation);imageView_top.startAnimation(in_top_Annotation);}else if(animation.equals(this.in_bottom_Annotation)){sensorManager.registerListener(this,sensor, SensorManager.SENSOR_DELAY_GAME);//完成动画后再次监听加速感应器}}@Overridepublic void onAnimationRepeat(Animation animation) {// TODO Auto-generated method stub}@Overridepublic void onAnimationStart(Animation animation) {// TODO Auto-generated method stub}}
main.xml
<?xml version="1.0" encoding="utf-8"?>

main.xml这个布局中没有控件,是因为我考虑到屏幕的适配,两个ImageView 都是直接在代码中调整的布局。具体在xml中怎么调整没研究过,估计可以使用layout_weight这个属性设置吧,具体没弄过。

刚刚玩微信的时候发现摇的时候有朵小红花。其实就是将布局设个背景就可以了。


还有,如果对代码有什么疑问或者有什么好的建议,可以留言,有时间看到一定会回复的。

更多相关文章

  1. 新浪微博Android客户端学习记录一:完成Logo界面
  2. android开发仿IOS滑动开关
  3. Coder Essential之客户端知识索引(iOS/Android/Web)
  4. android UI 之 渐变效果
  5. Android:Animation 使用手册
  6. 属性动画
  7. 改进Android(安卓)SlidingMenu实现QQ样式边侧滑抽屉技术
  8. Android(安卓)动画框架的基本原理
  9. android 资源文件的种类

随机推荐

  1. Android中显示Html内容(总结)
  2. Android(安卓)面试题(5):谈谈 Handler 机制
  3. 数据存储和界面展示一
  4. Android 4.4 SD卡文件读写变化
  5. Android菜鸟笔记3-Activity切换
  6. 【Mark 】AndroidStudio_移动应用开发
  7. 转-Android UI学习 - Tab的学习和使用
  8. Android UI LinearLayout权限级别与Table
  9. android滚动条
  10. android调用系统功能