編輯:關於Android編程
前些天印尼客戶要求在高通平台7251上加一個搖搖切歌功能。查了些資料,基本實現了此功能。
直接上源碼,用svn查看修改點。
前面兩個ic_mp_shake_off_btn是兩張圖片,資源隨便讓UI做兩張即可。
接下來就是audio_player.xml文件的修改:(這個就是你要將你的圖標按鈕放在哪個地方)
對應的修改其他分辨率的布局文件audio_player.xml
接下來添加對應的字串:String.xml<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PHByZSBjbGFzcz0="brush:java;">
接下來修改音樂播放的主類:MediaPlaybackActivity.java
首先要添加變量:private ImageButton mShakeButton;
接下來再通過findViewById來實例化搖搖按鈕並添加監聽;
mShakeButton = ((ImageButton) findViewById(R.id.shake)); mShakeButton.setOnClickListener(mShakeListener);
在函數onConfigurationChanged也做同樣的操作;
mShakeButton = ((ImageButton) findViewById(R.id.shake)); mShakeButton.setOnClickListener(mShakeListener);現在就來實現監聽的函數;private View.OnClickListener mShakeListener = new View.OnClickListener() { public void onClick(View v) { shakeEnable(); } };
寫shakeEnable()函數的函數體;private void shakeEnable(){ if (mService == null) { return; } try { if (mService.getShakeFlag()== false){ mService.setShakeFlag(true); showToast(R.string.shake_on_notif); } else{ mService.setShakeFlag(false); showToast(R.string.shake_off_notif); } setShakeButtonImage(); }catch (RemoteException ex) { } }在ServiceConnection裡修改按鈕的可操作和設置圖片;
寫setShakeButtonImage 函數:
private void setShakeButtonImage() { if (mService == null) return; try { if (mService.getShakeFlag() == false) { mShakeButton.setImageResource(R.drawable.ic_mp_shake_off_btn); }else{ mShakeButton.setImageResource(R.drawable.ic_mp_shake_on_btn); } }catch (RemoteException ex) { } }
MediaPlaybackActivity.java這個文件修改好了;
接下來看看MediaPlaybackService.java
先import onShakeListener
import com.android.music.ShakeDetector.onShakeListener;
申明變量:
private boolean mShakeFlag = false;
ShakeDetector mShakeDetector = null;
在onCreate()中從sharedpreference中讀取值,來設置是否打開搖搖功能;
mShakeFlag = mPreferences.getBoolean("shakeflag", false); setShakeOnorOff();
在onDestroy()中取消注冊:if (mShakeDetector != null) { mShakeDetector.unRegisterListener(); }實現函數:private void setShakeOnorOff(){ if (mShakeFlag == true){ mShakeDetector= new ShakeDetector(this); mShakeDetector.registerListener(); mShakeDetector.setOnShakeListener(new onShakeListener() { @Override public void onShake() { // TODO Auto-generated method stub if (isPlaying()){ gotoNext(true); } } }); }else{ if (mShakeDetector != null) { mShakeDetector.unRegisterListener(); } } Editor ed = mPreferences.edit(); ed.putBoolean("shakeflag", mShakeFlag); SharedPreferencesCompat.apply(ed); } public void setShakeFlag(boolean shakeflag) { synchronized (this) { mShakeFlag = shakeflag; setShakeOnorOff(); } } public boolean getShakeFlag() { return mShakeFlag; }
在IMediaPlaybackService.Stub中設置是否打開搖搖功能public void setShakeFlag(boolean shakeflag) { mService.get().setShakeFlag(shakeflag); } public boolean getShakeFlag() { return mService.get().getShakeFlag(); }
接下來就是在IMediaPlaybackService.aidl文件中添加對應的函數;void setShakeFlag(boolean shakeflag); boolean getShakeFlag();
最後就是添加一個文件ShakeDetector.javapackage com.android.music; 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 ShakeDetector implements SensorEventListener { private static final String TAG = "ShakeDetector"; private Context mContext; private long lastTime; private float last_x; private float last_y; private float last_z; private static final double SHAKE_SHRESHOLD = 3000d;//這個值可根據sensor的靈敏度來調整 private Sensor sensor; private SensorManager sensorManager; public onShakeListener shakeListener; public ShakeDetector(Context context) { mContext = context; sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); } public boolean registerListener() { if (sensorManager != null) { sensor = sensorManager .getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (sensor != null) { this.sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME); return true; } } return false; } public void unRegisterListener() { System.out.println("ShakeDetector:unRegisterListener"); if (sensorManager != null && sensor != null) sensorManager.unregisterListener(this , sensor); } public void setOnShakeListener(onShakeListener listener) { shakeListener = listener; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub long curTime = java.lang.System.currentTimeMillis(); if ((curTime - lastTime) > 50) { long diffTime = (curTime - lastTime); lastTime = curTime; float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; float speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000; System.out.println("ShakeDetector:onSensorChanged speed ="+speed); if (speed > SHAKE_SHRESHOLD) { shakeListener.onShake(); } last_x = x; last_y = y; last_z = z; } } public interface onShakeListener { public void onShake(); } }
好,到此為止,就可以實現搖搖切歌功能了,如果有用得上的,可以拿去用一下,別的平台(展訊,MTK)也都可以類似的實現此功能,有問題請在後面留言。
今天我們封裝一個底部的菜單欄,這個大多數的應用都會用到,因此我們來自定義,方便以後項目的使用。該控件的實現將分上下篇來介紹,先來看一個菜單欄的子控件–MenuItemM,
第十六章、訪問者模式 訪問者模式是一種行為型模式,它是23種設計模式中最復雜的一個,雖然使用頻率不高,但是並不代表可以忽略,在合適的地方,它會帶來意想不到的靈活性。訪問者
本文為原創博客,出自http://blog.csdn.net/minimicall 到今天為止,搜芽的賣家版本應該來說已經基本完成,攻堅克難的一路過來。速度也控制的比較好
TextView是Android裡面用的最多的UI組件,一般使用在需要顯示一些信息的時候,其不能輸入,只能初始設定或者在程序中修改。 實例:TextViewDemo