Java ImageView作为系统覆盖-旋转设备时位置错误

Java ImageView作为系统覆盖-旋转设备时位置错误,java,android,imageview,android-service,android-imageview,Java,Android,Imageview,Android Service,Android Imageview,我目前正试图为一款运行安卓2.3.4的特殊设备编写一款应用程序,它在屏幕上精确定义的位置放置一个系统覆盖。这就是为什么我使用绝对值来定位图层 我编写了一个活动(包括布局中的两个按钮),用于启动和停止显示此覆盖的服务 public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)

我目前正试图为一款运行安卓2.3.4的特殊设备编写一款应用程序,它在屏幕上精确定义的位置放置一个系统覆盖。这就是为什么我使用绝对值来定位图层

我编写了一个活动(包括布局中的两个按钮),用于启动和停止显示此覆盖的服务

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);
}
}
这是我的服务(它也被添加到清单文件中)

要显示为覆盖的图像的宽度(或高度,我没有找到API级别10下旋转Drawable的方法,因此我使用了两个图像,一个用于水平显示,一个用于垂直显示),在纵向模式(=600)下显示设备的屏幕分辨率,高度(或宽度)为12像素。我希望它位于硬件按钮所在的位置,即底部处于纵向模式,右侧逆时针旋转90°,顶部旋转180°,等等

这对于0°和90°旋转(CW)很有效,但是对于其他两个方向,图像显示在屏幕的中间,而不是在顶部或左侧。我做错了什么

编辑2012-04-19:
我已经将旋转_180的params.y的值更改为-1012,现在这个例子可以工作了。不过,我认为这不是预期的行为。旋转的类似更改\u 270不起作用…

我认为,当您的设备旋转180°时,它认为它处于纵向模式,因此旋转0°。因此,尝试使用相同的参数0和180,以及90和270。
我不确定这一点,也许我错了;)

好的,很抱歉,我在编写编辑时更改旋转参数时出错了

我得到了做我想做的事情的代码,以下是我所做的:

我将180°的y参数更改为-1012,将270°的x参数也更改为-1012。现在,在所有四个方向上,图像都显示在硬件按钮所在的位置

为了完整起见,我把它写在这里

(……)


(…)

谢谢。我试过了,但很抱歉这也不行。图像不再在屏幕中间,但是在180°和270°时,它在错误的一侧(在按钮顶部的底部,当按钮在左边时在右边)。
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;
    }
}
}
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;
}