2014年1月18日星期六

微信摇一摇

http://www.apkbus.com/android-85601-1-5.html

首先介绍一下 微信摇一摇实现原理 
利用加速感应,因为一般的android手机都支持此感应,应用很普遍,然后利用动画实现图片上下分开的效果。当然为了实用在图片上下分开的同时可以加上一些音乐和震动,
播放音乐
MediaPlayer player;
  player = MediaPlayer.create(this, R.raw.awe);
  player.setLooping(false);
        player.start();  

添加震动,,当然震动是系统调用,需要权限 <uses-permission android:name="android.permission.VIBRATE" />

Vibrator mVibrator;
mVibrator = (Vibrator)getApplication().getSystemService(VIBRATOR_SERVICE);
mVibrator.vibrate( new long[]{500,200,500,200}, -1); //第一个{}里面是节奏数组, 第二个参数是重复次数,-1为不重复,非-1俄日从pattern的指定下标开始重复

记得用完使用 mVibrator.cancel(); 消除
现在开始实现功能
实现 android加速感应的监听事件接口  SensorEventListener   



实现该接口 需要覆写,eclipse自动提示
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
  // TODO Auto-generated method stub
  
}
@Override
public void onSensorChanged(SensorEvent event) {
  // TODO Auto-generated method stub
  
}


、、、、、、、、、、、、、、、、、、、、、、在这里我们封装好感应类、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

package com.example.sensoreventlistenertest;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
/**
* 一个检测手机摇晃的监听器
*/
public class ShakeListener implements SensorEventListener {
// 速度阈值,当摇晃速度达到这值后产生作用
private static final int SPEED_SHRESHOLD = 3000;
// 两次检测的时间间隔
private static final int UPTATE_INTERVAL_TIME = 70;
// 传感器管理器
private SensorManager sensorManager;
// 传感器
private Sensor sensor;
// 重力感应监听器
private OnShakeListener onShakeListener;
// 上下文
private Context mContext;
// 手机上一个位置时重力感应坐标
private float lastX;
private float lastY;
private float lastZ;
// 上次检测时间
private long lastUpdateTime;
// 构造器
public ShakeListener(Context c) {
  // 获得监听对象
  mContext = c;
  start();
}
// 开始
public void start() {
  // 获得传感器管理器
  sensorManager = (SensorManager) mContext
    .getSystemService(Context.SENSOR_SERVICE);
  if (sensorManager != null) {
   // 获得重力传感器
   sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
  }
  // 注册
  if (sensor != null) {
   sensorManager.registerListener(this, sensor,
     SensorManager.SENSOR_DELAY_GAME);
  }
}
// 停止检测
public void stop() {
  sensorManager.unregisterListener(this);
}
// 设置重力感应监听器
public void setOnShakeListener(OnShakeListener listener) {
  onShakeListener = listener;
}
// 重力感应器感应获得变化数据
public void onSensorChanged(SensorEvent event) {
  // 现在检测时间
  long currentUpdateTime = System.currentTimeMillis();
  // 两次检测的时间间隔
  long timeInterval = currentUpdateTime - lastUpdateTime;
  // 判断是否达到了检测时间间隔
  if (timeInterval < UPTATE_INTERVAL_TIME)
   return;
  // 现在的时间变成last时间
  lastUpdateTime = currentUpdateTime;
  // 获得x,y,z坐标
  float x = event.values[0];
  float y = event.values[1];
  float z = event.values[2];
  // 获得x,y,z的变化值
  float deltaX = x - lastX;
  float deltaY = y - lastY;
  float deltaZ = z - lastZ;
  // 将现在的坐标变成last坐标
  lastX = x;
  lastY = y;
  lastZ = z;
  //sqrt 返回最近的双近似的平方根
  double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
    * deltaZ)/ timeInterval * 10000;
  Log.v("thelog", "===========log===================");
  // 达到速度阀值,发出提示
  if (speed >= SPEED_SHRESHOLD) {
   onShakeListener.onShake();
  }
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
// 摇晃监听接口
public interface OnShakeListener {
  public void onShake();
}
}

,,,,,,,,,,,,,,,,,,,,,,,,,,封装好了就 可以调用可在Activiyt中,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,



package com.example.sensoreventlistenertest;

import com.example.sensoreventlistenertest.ShakeListener.OnShakeListener;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Vibrator;
import android.app.Activity;
import android.content.Intent;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.SlidingDrawer;
import android.widget.Toast;
import android.widget.SlidingDrawer.OnDrawerCloseListener;
import android.widget.SlidingDrawer.OnDrawerOpenListener;

public class MainActivity extends Activity{

ShakeListener mShakeListener = null;
Vibrator mVibrator;
private RelativeLayout mImgUp;
private RelativeLayout mImgDn;
private RelativeLayout mTitle;

private SlidingDrawer mDrawer;
private Button mDrawerBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main);
  
  //drawerSet ();//设置  drawer监听    切换 按钮的方向
  
  mVibrator = (Vibrator)getApplication().getSystemService(VIBRATOR_SERVICE);
  
  mImgUp = (RelativeLayout) findViewById(R.id.shakeImgUp);
  mImgDn = (RelativeLayout) findViewById(R.id.shakeImgDown);
  mTitle = (RelativeLayout) findViewById(R.id.shake_title_bar);
  
  mDrawer = (SlidingDrawer) findViewById(R.id.slidingDrawer1);
        mDrawerBtn = (Button) findViewById(R.id.handle);
        mDrawer.setOnDrawerOpenListener(new OnDrawerOpenListener()
  { public void onDrawerOpened()
   { 
    mDrawerBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.shake_report_dragger_down));
    TranslateAnimation titleup = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,-1.0f);
    titleup.setDuration(200);
    titleup.setFillAfter(true);
    mTitle.startAnimation(titleup);
   }
  });
   /* 设定SlidingDrawer被关闭的事件处理 */
  mDrawer.setOnDrawerCloseListener(new OnDrawerCloseListener()
  { public void onDrawerClosed()
   { 
    mDrawerBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.shake_report_dragger_up));
    TranslateAnimation titledn = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,-1.0f,Animation.RELATIVE_TO_SELF,0f);
    titledn.setDuration(200);
    titledn.setFillAfter(false);
    mTitle.startAnimation(titledn);
   }
  });
  
  mShakeListener = new ShakeListener(MainActivity.this);
        mShakeListener.setOnShakeListener(new OnShakeListener() {
   public void onShake() {
    //Toast.makeText(getApplicationContext(), "抱歉,暂时没有找到在同一时刻摇一摇的人。\n再试一次吧!", Toast.LENGTH_SHORT).show();
    startAnim();  //开始 摇一摇手掌动画
    mShakeListener.stop();
    
    startVibrato(); //开始 震动
    new Handler().postDelayed(new Runnable(){
     @Override
     public void run(){
      //Toast.makeText(getApplicationContext(), "抱歉,暂时没有找到\n在同一时刻摇一摇的人。\n再试一次吧!", 500).setGravity(Gravity.CENTER,0,0).show();
      Toast mtoast;
      mtoast = Toast.makeText(getApplicationContext(),
            "抱歉,暂时没有找到\n在同一时刻摇一摇的人。\n再试一次吧!", 10);
          //mtoast.setGravity(Gravity.CENTER, 0, 0);
          mtoast.show();
          mVibrator.cancel();
          mShakeListener.start();
     }
    }, 2000);
   }
  });
   }
public void startAnim () {   //定义摇一摇动画动画  ,当然为了简介代码你也可以把动画定义成一个XML文件
  AnimationSet animup = new AnimationSet(true);
  TranslateAnimation mytranslateanimup0 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,-0.5f);
  mytranslateanimup0.setDuration(1000);
  TranslateAnimation mytranslateanimup1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,+0.5f);
  mytranslateanimup1.setDuration(1000);
  mytranslateanimup1.setStartOffset(1000);
  animup.addAnimation(mytranslateanimup0);
  animup.addAnimation(mytranslateanimup1);
  mImgUp.startAnimation(animup);
  
  AnimationSet animdn = new AnimationSet(true);
  TranslateAnimation mytranslateanimdn0 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,+0.5f);
  mytranslateanimdn0.setDuration(1000);
  TranslateAnimation mytranslateanimdn1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,-0.5f);
  mytranslateanimdn1.setDuration(1000);
  mytranslateanimdn1.setStartOffset(1000);
  animdn.addAnimation(mytranslateanimdn0);
  animdn.addAnimation(mytranslateanimdn1);
  mImgDn.startAnimation(animdn); 
}
public void startVibrato(){ 
  MediaPlayer player;
  player = MediaPlayer.create(this, R.raw.awe);
  player.setLooping(false);
        player.start();
  
  
  //定义震动
  mVibrator.vibrate( new long[]{500,200,500,200}, -1); //第一个{}里面是节奏数组, 第二个参数是重复次数,-1为不重复,非-1俄日从pattern的指定下标开始重复
}

public void shake_activity_back(View v) {     //标题栏 返回按钮
       this.finish();
      }  
public void linshi(View v) {     //标题栏
  startAnim();
      }  
@Override
protected void onDestroy() {
  super.onDestroy();
  if (mShakeListener != null) {
   mShakeListener.stop();
  }
}
}


,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,最后贴上布局文件,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#111"
    >
    
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerInParent="true" >
   
        <ImageView
            android:id="@+id/shakeBg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"        
            android:src="@drawable/shakehideimg_man2" />
        
        <LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_centerInParent="true"
         android:orientation="vertical" >
         
            <RelativeLayout
                android:id="@+id/shakeImgUp"   
          android:layout_width="fill_parent"
          android:layout_height="190dp"          
          android:background="#111">          
                <ImageView              
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentBottom="true"
              android:layout_centerHorizontal="true"                        
              android:src="@drawable/shake_logo_up"
               />                
            </RelativeLayout>
            <RelativeLayout
                android:id="@+id/shakeImgDown"
          android:layout_width="fill_parent"
          android:layout_height="190dp"          
          android:background="#111">          
                <ImageView              
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_centerHorizontal="true"                        
              android:src="@drawable/shake_logo_down"
               />                
            </RelativeLayout> 
        </LinearLayout>
    </RelativeLayout>
    
    <RelativeLayout 
        android:id="@+id/shake_title_bar" 
    android:layout_width="fill_parent"
    android:layout_height="45dp"
    android:background="@drawable/title_bar"
    android:gravity="center_vertical"  >
     <Button
             android:layout_width="70dp"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
             android:text="返回"
             android:textSize="14sp"
             android:textColor="#fff"
             android:onClick="shake_activity_back"
             android:background="@drawable/title_btn_back"/>  
        <TextView
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:text="摇一摇"
          android:layout_centerInParent="true"
          android:textSize="20sp"  
    android:textColor="#ffffff" /> 
   <ImageButton 
       android:layout_width="67dp" 
          android:layout_height="wrap_content"
          android:layout_alignParentRight="true" 
          android:layout_centerVertical="true"
          android:layout_marginRight="5dp"
          android:src="@drawable/mm_title_btn_menu"
    android:background="@drawable/title_btn_right"
    android:onClick="linshi" 
       />      
</RelativeLayout>
    
    <SlidingDrawer
        android:id="@+id/slidingDrawer1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:content="@+id/content"
        android:handle="@+id/handle" >
        <Button
            android:id="@+id/handle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"     
                  
            android:background="@drawable/shake_report_dragger_up" />
        <LinearLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#f9f9f9" >            
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:scaleType="fitXY"
                android:src="@drawable/shake_line_up" />
        </LinearLayout>
    </SlidingDrawer>
</RelativeLayout>

没有评论:

发表评论