2012-04-12 78 views
0

我目前正在嘗試編寫一個運行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的類似更改無效...

回答

0

好的,我很抱歉,當我編輯我的編輯時,在更改ROTATION_270的參數時我犯了一個錯誤。

我得到的代碼做我想要的東西,這是我做的:

我改變的Y參數有關180°-1012和X參數有關270°至-1012,太。現在,在所有四個方向中,圖像顯示在硬件按鈕所在的位置。

爲了完整起見,我在這裏寫下來。

(...)

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 = -1012; 
     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 = -1012; params.y = 0; 
     imageRes = R.drawable.vertical; 
     break; 
} 

(...)

0

我認爲當您的設備旋轉180°時,它認爲它處於肖像模式,因此旋轉0°。所以嘗試使用相同的參數0和180,以及90和270. 我不知道這一點,也許我錯了;)。

+0

感謝。我試過這個,但是我很抱歉說這不起作用。圖像不再位於屏幕中間,但對於180°和270°,圖像位於錯誤的一側(按鈕位於頂部,底部位於底部,按鈕位於左側時位於右側)。 – Kerstin 2012-04-13 14:51:56

相關問題