Android屏幕上的浮动视图
我试图制作一个浮动视图,用户可以在屏幕上拖动 其想法是启动一项服务,然后在屏幕上放大视图 但是有一个问题,它不是获取事件本身,而是获取所有用户输入事件 这是我的密码: manifest.xml文件:Android屏幕上的浮动视图,android,view,android-custom-view,floating,Android,View,Android Custom View,Floating,我试图制作一个浮动视图,用户可以在屏幕上拖动 其想法是启动一项服务,然后在屏幕上放大视图 但是有一个问题,它不是获取事件本身,而是获取所有用户输入事件 这是我的密码: manifest.xml文件: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.floatandroidpractice"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.floatandroidpractice.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.example.floatandroidpractice.WalkingIconService" />
</application>
</manifest>
以及服务:
package com.example.floatandroidpractice;
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
public class WalkingIconService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
littleIconView a = new littleIconView(getApplicationContext());
LayoutParams mLayoutParams = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0, 0, PixelFormat.TRANSPARENT);
WindowManager mWindowManager = (WindowManager) this.getSystemService(WINDOW_SERVICE);
mLayoutParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE
| LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
LayoutParams.FLAG_LAYOUT_INSET_DECOR | LayoutParams.FLAG_LAYOUT_IN_SCREEN;
mWindowManager.addView(a, mLayoutParams);
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
完整项目:我尝试了你在画布上绘制图像的方法,但没有成功。我从中学习的一个例子。也许这能让你朝着正确的方向前进,也许不行,但这对我很有效 WalkingIconService.java
package ...
//imports
public class WalkingIconService extends Service {
private WindowManager mWindowManager;
private ImageView image;
public void onCreate() {
super.onCreate();
image = new ImageView(this);
image.setImageResource(R.drawable.ic_launcher);
mWindowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
final LayoutParams paramsF = new WindowManager.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,
LayoutParams.TYPE_PHONE,
LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
paramsF.gravity = Gravity.TOP | Gravity.LEFT;
paramsF.x=0;
paramsF.y=100;
mWindowManager.addView(image, paramsF);
try{
image.setOnTouchListener(new View.OnTouchListener() {
WindowManager.LayoutParams paramsT = paramsF;
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:
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);
mWindowManager.updateViewLayout(v, paramsF);
break;
}
return false;
}
});
} catch (Exception e){
e.printStackTrace();
}
}
@Overrride
public void onDestroy(){
super.onDestory();
}
}
MainActivity.java
package ...
//imports
public class MainActivity extends Activity {
@Override
public void onCreate(icicle) {
super.onCreate(icicle);
setcontentView(R.layout.activity_main);
Button b = (Button)findViewById(R.id.tv);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//toast
startService(new Intent(MainActivity.this, WalkingIconService.class));
}
});
//stopService (from my original code)
Button stop = (Button)findViewById.(R.id.btnStop);
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopService(new Intent(MainActivity.this, WalkingIconService.class));
}
});
}
}
默认情况下,当使用包裹内容布局时,视图将占用整个可用空间。在启动服务检查设置之前,您需要在WindowManager.LayoutParams、override view.onMeasure或(理想情况下)扩展ImageView而不是view中明确指定视图大小。来自api 23+ 许可:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(ConversationsActivityWithSpam.this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 16);
return false;
}
}
尝试将onTouchEvent()的代码与逻辑(您希望如何设置该视图的动画/浮动)放在onAttachedToWindow()或onAnimationStart()中。检查“View”类的生命周期方法。你能告诉我为什么它需要所有的输入事件吗?实际上它在onTouchEvent中,用户需要传递输入意味着拖动右/左/上/下。因此,如果您想要浮动视图,那么您需要传递这些输入。您不也需要为参数设置警报标志吗?@zgulser services保持活动状态,在屏幕上使用其他AppsThank进行回复,我将在解决方案可用时发布。很高兴能为@Shirane85提供帮助。如果您或任何人发现任何改进,请随时提供,我希望使我的代码更干净,更好地为他人服务。@CodeMonkey此代码有问题。每当我关闭“活动”时,
WalkingIconService
将重新创建自身(浮动视图消失,然后出现)。您使用了stopService吗?我会像在我的原始代码中一样,通过单击按钮来编辑MainActivity代码,以包含该代码。我知道这有点旧,但请注意,在API 23+上,您需要获得权限才能使用其他应用程序,并且必须使用新的请求API来询问用户。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(ConversationsActivityWithSpam.this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 16);
return false;
}
}