是否可以在其他应用上绘制一条线?
例如,有一个应用程序显示地图,我想在另一个应用程序的顶部绘制一条线,例如从A到B的路线。
我添加了权限
android.permission.SYSTEM_ALERT_WINDOW
并添加了代码以在其他应用上显示视图。
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final WindowManager.LayoutParams param=new WindowManager.LayoutParams();
param.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
final View view=findViewById(R.id.my_floating_view);
final ViewGroup parent=(ViewGroup)view.getParent();
if(parent!=null)
parent.removeView(view);
param.format=PixelFormat.RGBA_8888;
param.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
param.gravity=Gravity.CENTER;
param.width=parent!=null?LayoutParams.WRAP_CONTENT:view.getLayoutParams().width;
param.height=parent!=null?LayoutParams.WRAP_CONTENT:view.getLayoutParams().height;
final WindowManager wmgr=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
wmgr.addView(view,param);
}
我的问题是,当我打开我的应用程序时,我会看到整个活动,并且我希望隐藏活动并仅查看另一个应用程序顶部的视图。 也就是在我的地图应用程序示例中,我希望看到地图并在其上方查看我绘制的线条。我不想看到我的应用程序的名称等。
我该怎么做?
答案 0 :(得分:0)
基本上,explained here Facebook是如何使Chathead应用程序浮动到其他应用程序之上的,并且您必须将其作为服务运行。我跟着一个example,它使图像图标浮动在其他所有内容之上。这是示例中的代码。它不是你想要的确切答案,但它应该有所帮助,你可以调整代码到你需要做的事情。你从正确的方向开始,我希望这将有助于缩小你所需的绝对方向。
MainActivity.java
package com.example.floatingicon;
import com.example.floatingicon.R;
import com.example.floatingicon.MainService;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle icicle){
super.onCreate(icicle);
setContentView(R.layout.main);
Bundle bund = getIntent().getExtras();
if(bund != null && bun.getString("LAUNCH").equals("YES")){
startService(new Intent(MainActivity.this, MainService.class));
}
Button start = (Button)findViewById(R.id.btnStart);
start.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
startService(new Intent(MainActivity.this, MainService.class));
}
});
Button stop = (Button)findViewById(R.id.btnStop);
stop.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
stopService(new Intent(MainActivity.this, MainService.class));
}
});
}
@Override
protected void onResume(){
Bundle bund = getIntent().getExtras();
if(bund != null && bund.getString("LAUNCH").equals("YES")){
startService(new Intent(MainActivity.this, MainService.class));
}
super.onResume();
}
}
MainService.java
package com.example.floatingicon;
import com.example.floatingicon.R;
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
public class MainService extends Service {
private WindowManager windowManager;
private ImageView floatIcon;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
floatIcon = new ImageView(this);
floatIcon.setImageResource(R.drawable.floating);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
windowManager.addView(floatIcon, params);
try {
floatIcon.setOnTouchListener(new View.OnTouchListener() {
private WindowManager.LayoutParams paramsF = params;
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// Get current time in nano seconds.
initialX = paramsF.x;
initialY = paramsF.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
paramsF.x = initialX + (int) (event.getRawX() - initialTouchX);
paramsF.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(floatIcon, paramsF);
break;
}
return false;
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (floatIcon != null) windowManager.removeView(floatIcon);
}
}
main.xml中
<?xml version="1.0" encoding="utf-8" ?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginTop="100dp"
android:text="@string/start" />
<Button
android:id="@+id/btnStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/btnStart"
android:layout_alignRight="@id/btnStart"
android:layout_below="@id/btnStart"
android:layout_marginTop="10dp"
android:text="@string/stop" />
</RelativeLayout>
这应该可以帮助你开始,除非你已经完成了所有这些时间。