0

私は現在、Android 2.3.4 を実行している 1 つの特別なデバイス用のアプリを作成しようとしています。このアプリは、画面上の正確に定義された場所にシステム オーバーレイを配置します。これが、絶対値を使用してレイヤーを配置する理由です。

このオーバーレイを表示するサービスを開始および停止するアクティビティ (レイアウトに 2 つのボタンを含む) を作成しました。

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;
    }
}
}

オーバーレイとして表示する画像の幅 (または高さ、API レベル 10 でドローアブルを回転させる方法が見つからなかったので、2 つの画像を使用しました。1 つは水平表示用、もう 1 つは垂直表示用です) は、デバイスの縦向きの画面解像度です。モード (=600) と 12 ピクセルの高さ (または幅)。ハードウェア ボタンがある場所に配置する必要があります。つまり、下が縦向きモードで、右が反時計回りに 90°回転したとき、上が 180°回転したときなどです。

これは 0° と 90° (ccw) の回転ではうまく機能しますが、他の 2 つの方向では、画像は画面の上部や左側ではなく中央に表示されます。私は何を間違っていますか?

EDIT 2012-04-19: ROTATION_180 の params.y の値を -1012 に変更しました。このケースは現在機能しています。ただし、これは期待される動作ではないと思います。ROTATION_270 の同様の変更は機能しませんでした...

4

2 に答える 2

0

OK、すみません、編集を書いたときに ROTATION_270 のパラメータを変更するときに間違いを犯しました。

私がやりたいことをするためのコードを手に入れました。これが私がしたことです:

180° の y-param を -1012 に、270° の x-param も -1012 に変更しました。これで、4 つの方向すべてで、ハードウェア ボタンがある場所に画像が表示されます。

完全を期すために、ここに書き留めておきます。

(...)

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;
}

(...)

于 2012-04-21T08:17:03.900 に答える
0

デバイスが180°回転すると、縦向きモードであると見なされるため、0°回転すると思います。ですから、0 と 180、および 90 と 270 に同じパラメータを使用してみてください。

于 2012-04-12T16:06:42.587 に答える