您的位置:首页 > 移动开发 > 微信开发

Androidの高级交互之仿微信摇一摇(真心摇一摇,而不是像网传的就那么简单的震动一下)

2012-12-13 18:08 483 查看




话不多说看代码

布局文件:

<?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:gravity="center"
android:background="#666">

<ImageView android:id="@+id/iv_hide"
android:src="@drawable/shakehideimg_man"
android:scaleType="fitCenter"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>

<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="center"
android:layout_centerInParent="true">

<RelativeLayout android:id="@+id/frameTop"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#333"
android:layout_weight="1">

<ImageView android:id="@+id/ivTop"
android:src="@drawable/shake_logo_up"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView android:id="@+id/shake_line_up"
android:background="@drawable/up"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />

</RelativeLayout>

<RelativeLayout android:id="@+id/frameBot"
android:layout_weight="1"
android:background="#333"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/frameTop">

<ImageView android:id="@+id/ivBot"
android:src="@drawable/shake_logo_down"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<ImageView android:id="@+id/shake_line_down"
android:background="@drawable/down"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
/>

</RelativeLayout>

</LinearLayout>

</RelativeLayout>


java:

package cn.com.bvin.shake;

import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

public class MainActivity extends Activity implements SensorEventListener,AnimationListener{
/** Called when the activity is first created. */

private SensorManager sMan;
private Sensor sensor;
private Animation topInAnim = null;
private Animation topOutAnim = null;
private Animation botInAnim = null;
private Animation botOutAnim = null;
private int duration =630;
private ImageView ivTop;
private ImageView ivBot;

private ImageView shake_bg;

private ImageView shake_line_up;
private ImageView shake_line_down;

private RelativeLayout shake_panel_up;
private RelativeLayout shake_panel_down;

private int scr_h,src_w;

private MediaPlayer mPlayer;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
scr_h = getWindowManager().getDefaultDisplay().getHeight();
src_w = getWindowManager().getDefaultDisplay().getWidth();
initSensorManager();
initViews();
initAnim();
initPlayer();
}

private  void initPlayer(){
mPlayer = new MediaPlayer();
//mPlayer.setDataSource(context, uri);
AssetManager aMan = this.getAssets();
try {
AssetFileDescriptor  fileDescriptor = aMan.openFd("shake_sound_male.mp3");
mPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(),fileDescriptor.getLength());
mPlayer.prepare();
//mPlayer.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private void initSensorManager(){

sMan = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
sensor = sMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sMan.registerListener(this, sensor,SensorManager.SENSOR_DELAY_NORMAL);

}

private void initAnim(){

topOutAnim = new TranslateAnimation(0,0,0,-(float)scr_h/4);
topOutAnim.setDuration(duration);
topOutAnim.setInterpolator(new DecelerateInterpolator());

botOutAnim = new TranslateAnimation(0,0,0,(float)scr_h/4);
botOutAnim.setDuration(duration);
botOutAnim.setInterpolator(new DecelerateInterpolator());

topInAnim = new TranslateAnimation(0,0,-(float)scr_h/4,0);
topInAnim.setDuration(duration);
topInAnim.setInterpolator(new AccelerateInterpolator());

botInAnim = new TranslateAnimation(0,0,(float)scr_h/4,0);
botInAnim.setDuration(duration);
botInAnim.setInterpolator(new AccelerateInterpolator());

botInAnim.setAnimationListener(this);
botOutAnim.setAnimationListener(this);

}

private void initViews(){

shake_bg = (ImageView)findViewById(R.id.iv_hide);

shake_panel_up = (RelativeLayout)findViewById(R.id.frameTop);
shake_panel_down = (RelativeLayout)findViewById(R.id.frameBot);

shake_line_up = (ImageView)findViewById(R.id.shake_line_up);
shake_line_down = (ImageView)findViewById(R.id.shake_line_down);
shake_line_up.setVisibility(View.INVISIBLE);
shake_line_down.setVisibility(View.INVISIBLE);

ivTop =  (ImageView)findViewById(R.id.ivTop);
ivBot = (ImageView)findViewById(R.id.ivBot);
}

@Override
public void onAnimationEnd(Animation arg0) {
// TODO Auto-generated method stub
if(arg0 == botOutAnim){//夹门打开
shake_panel_up.startAnimation(topInAnim);
shake_panel_down.startAnimation(botInAnim);
}else if(arg0.equals(botInAnim)){//夹门关闭
Log.e("wn", "sdgsdg");
sMan.registerListener(this, sensor,SensorManager.SENSOR_DELAY_NORMAL);
shake_line_up.setVisibility(View.INVISIBLE);
shake_line_down.setVisibility(View.INVISIBLE);
shake_bg.setVisibility(View.INVISIBLE);
//完成动画后,再次监听加速器
}
}

@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub

}

@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub

}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub

}

@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
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){

shake_line_up.setVisibility(View.VISIBLE);
shake_line_down.setVisibility(View.VISIBLE);
shake_bg.setVisibility(View.VISIBLE);
mPlayer.start();
shake_panel_up.startAnimation(topOutAnim);
shake_panel_down.startAnimation(botOutAnim);
sMan.unregisterListener(this);
}
}

}


附件怎么传啊?怎么我没看到哪里传附件啊,我没权限么,源码可以共享啊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: