我目前正在嘗試編寫一個運行Android 2.3.4的特殊設備的應用程序,它將系統疊加在屏幕上的精確定義的點上。這就是我使用絕對值定位圖層的原因。ImageView作爲系統重疊 - 錯誤的位置時旋轉設備
我編寫了一個活動(包括佈局中的兩個按鈕),用於啓動和停止顯示此疊加層的服務。
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void showOverlay(View view) {
Intent i = new Intent("myPackage.myService");
startService(i);
}
public void hideOverlay(View view) {
Intent i = new Intent("myPackage.myService");
stopService(i);
}
}
這是我的服務(它也被添加到清單文件中)。
public class MyService extends Service {
ImageView iv;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
int imageRes = 0;
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.NO_GRAVITY;
params.alpha = 1;
switch (findRotation()) {
case Surface.ROTATION_0:
params.height = 12; params.width = 600; params.x = 0; params.y = 1012;
imageRes = R.drawable.horizontal;
break;
case Surface.ROTATION_180:
params.height = 12; params.width = 600; params.x = 0; params.y = 0;
imageRes = R.drawable.horizontal;
break;
case Surface.ROTATION_90:
params.height = 600; params.width = 12; params.x = 1012; params.y = 0;
imageRes = R.drawable.vertical;
break;
case Surface.ROTATION_270:
params.height = 600; params.width = 12; params.x = 0; params.y = 0;
imageRes = R.drawable.vertical;
break;
}
final WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
iv = new ImageView(getApplicationContext());
iv.setClickable(false);
iv.setImageResource(imageRes);
iv.draw(new android.graphics.Canvas());
wm.addView(iv, params);
}
private int findRotation() {
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
return display.getRotation();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
onDestroy(); //I don't know how to to make the service reposition the layer, so I used this. Not nice but it works
onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
if(iv != null) {
((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(iv);
iv = null;
}
}
}
顯示爲覆蓋該圖像具有的寬度(或heigth,我沒有找到一種方法在API級10能夠旋轉drawabled,所以就用兩個圖像,一個用於水平顯示,一個用於垂直)我的設備在縱向模式(= 600)下的屏幕分辨率和12像素的高度(或寬度)。我希望它位於硬件按鈕所在的位置,即在底部的縱向模式下,右側逆時針旋轉90°,頂部旋轉180°時等等。
這適用於0°和90°(ccw)的旋轉,但對於其他兩個方向,圖像顯示在屏幕中間而不是頂部或左側。我究竟做錯了什麼?
編輯2012-04-19: 我已將params.y的值ROTATION_180更改爲-1012,此例現在可用。不過,我不認爲這是預期的行爲。對於ROTATION_270的類似更改無效...
感謝。我試過這個,但是我很抱歉說這不起作用。圖像不再位於屏幕中間,但對於180°和270°,圖像位於錯誤的一側(按鈕位於頂部,底部位於底部,按鈕位於左側時位於右側)。 – Kerstin 2012-04-13 14:51:56