2012-03-29 3 views
4

이 대답에서 코드를 구현하는 방법을 파악하는 데 문제가 있습니다. Android: I want to shake it흔들기 이벤트 구현

mAccel이 0보다 큰지 확인하려면 if 문을 사용하여 메서드를 만들어야합니까?

package your.shake.namespace; 

    import android.app.Activity; 
    import android.content.Context; 
    import android.hardware.Sensor; 
    import android.hardware.SensorEvent; 
    import android.hardware.SensorEventListener; 
    import android.hardware.SensorManager; 
    import android.os.Bundle; 
    import android.os.Vibrator; 
    import android.widget.TextView; 

public class ShakeListener extends Activity { 

TextView display; 
Vibrator v; 

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); 
     mAccel = 0.00f; 
     mAccelCurrent = SensorManager.GRAVITY_EARTH; 
     mAccelLast = SensorManager.GRAVITY_EARTH; 
     display = (TextView) findViewById(R.id.tvText); 
     v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
} 

private SensorManager mSensorManager; 
    private float mAccel; // acceleration apart from gravity 
    private float mAccelCurrent; // current acceleration including gravity 
    private float mAccelLast; // last acceleration including gravity 

    private final SensorEventListener mSensorListener = new SensorEventListener() { 

    public void onSensorChanged(SensorEvent se) { 
     float x = se.values[0]; 
     float y = se.values[1]; 
     float z = se.values[2]; 
     mAccelLast = mAccelCurrent; 
     mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z)); 
     float delta = mAccelCurrent - mAccelLast; 
     mAccel = mAccel * 0.9f + delta; // perform low-cut filter 


    } 

    public void onAccuracyChanged(Sensor sensor, int accuracy) {    
    } 
    }; 

    // My code 3_29_12 
public void shake(){ 

    if (mAccel > 2.00f){ 
     v.vibrate(100); 
    } 
    else{ 
     mAccel = 0.00f; 

     }  

} 




    @Override 
    protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    @Override 
    protected void onStop() { 
    mSensorManager.unregisterListener(mSensorListener); 
    super.onStop(); 
    } 
+0

이해가 안 // 아래의 코드

linearLayout = (LinearLayout) findViewById(R.id.test); shake = AnimationUtils.loadAnimation(this, R.anim.shake); 

를 붙여 // 후

private Animation shake; private LinearLayout linearLayout; 

당신의 문제. 리스너 (mSensorListener)가 호출되고 있습니까? x, y, z에 어떤 값을 부여합니까? 또한 코드를 정리해야합니다. 나는 mAccel에 대한 선언을 할 수 있지만 shake() 메서드에 대한 선언은 할 수 없습니다. 마지막으로 어디에서 shake()를 호출합니까? – Simon

답변

8

나는 이것이 당신을 더 쉽게 만들 것이라고 생각합니다.

Shaker이라는 새 클래스를 만들고이를 추가하십시오.

public class Shaker { 
private SensorManager mgr = null; 
private long lastShakeTimestamp = 0; 
private double threshold = 1.0d; 
private long gap = 0; 
private Shaker.Callback cb = null; 

public Shaker(Context ctxt, double threshold, long gap, Shaker.Callback cb) { 
    this.threshold = threshold * threshold; 
    this.threshold = this.threshold * SensorManager.GRAVITY_EARTH 
      * SensorManager.GRAVITY_EARTH; 
    this.gap = gap; 
    this.cb = cb; 

    mgr = (SensorManager) ctxt.getSystemService(Context.SENSOR_SERVICE); 
    mgr.registerListener(listener, 
      mgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_UI); 
} 

public void close() { 
    mgr.unregisterListener(listener); 
} 

private void isShaking() { 
    long now = SystemClock.uptimeMillis(); 
    try { 
     if (lastShakeTimestamp == 0) { 
      lastShakeTimestamp = now; 

      if (cb != null) { 
       cb.shakingStarted(); 
      } 
     } else { 
      lastShakeTimestamp = now; 
     } 
    } catch (NullPointerException e) { 

    } 
} 

private void isNotShaking() { 
    long now = SystemClock.uptimeMillis(); 

    if (lastShakeTimestamp > 0) { 
     if (now - lastShakeTimestamp > gap) { 
      lastShakeTimestamp = 0; 

      if (cb != null) { 
       cb.shakingStopped(); 
      } 
     } 
    } 
} 

public interface Callback { 
    void shakingStarted(); 

    void shakingStopped(); 
} 

private final SensorEventListener listener = new SensorEventListener() { 
    @Override 
    public void onSensorChanged(SensorEvent e) { 
     if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
      double netForce = e.values[0] * e.values[0]; 

      netForce += e.values[1] * e.values[1]; 
      netForce += e.values[2] * e.values[2]; 

      if (threshold < netForce) { 
       isShaking(); 
      } else { 
       isNotShaking(); 
      } 
     } 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // unused 
     } 
    }; 
} 
당신의 Activity Shaker.Callback를 구현하고 사용하는 방법 shakingStarted()에서

shakingStopped() 실제로 뭔가를 할 수 있습니다.

+0

이 작업을 수행 할 수 없습니다. 내 주요 활동에 그것을 구현하고 두 가지 방법을 사용하지만 갤럭시 S2 또는 S4 중 하나에 내 떨림을 등록하지 않습니다 – Jonno

+0

활동의 onCreate에서 이것을 호출하십시오 : 셰이커 셰이커 = 새로운 셰이커 (getBaseContext(), 1.0d, 0, 이); –

+0

생성자에서 마지막 매개 변수를 전달하는 방법 콜백 ..? –

0

안녕 간단한 사용 악수 이벤트에 대한 다음 코드를 내가 선형 레이아웃

주 1 흔들림 이벤트를 추가하고 : 아래의 코드

<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:duration="1000" 
android:fromXDelta="0" 
android:interpolator="@anim/test" 
android:toXDelta="30" /> 
을 폴더 ANIM를 만들고 shake.xml을 만들고 추가

test.xml의를 만들고 아래 코드를 추가합니다

<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" 
android:cycles="7" /> 

주 2 : 클래스에 다음 코드를 사용합니다. 에서 onCreate 우리가 버튼을 누른에 아래의 코드를 사용할 수 있습니다 또는 귀하의 요구 사항에 따라

linearLayout.startAnimation(shake);