整个应用程序的浮动视图

Posted

技术标签:

【中文标题】整个应用程序的浮动视图【英文标题】:Floating view over the whole application 【发布时间】:2014-01-30 19:21:31 【问题描述】:

我需要对我的所有应用程序有一个浮动视图。 我可以使用 Window_service,但我的视图不需要位于应用程序之外。 仅在我的应用程序中。

我也不希望用户看到“在其他应用程序上绘图”权限。 我还能怎么做?

【问题讨论】:

您可以在具有浮动视图和片段的 Activity 中构建您的应用程序,因此当您需要更改“背景”内容时,您只需更改片段... 【参考方案1】:

我不得不做类似的事情。就我而言,我希望我的所有日​​志记录语句都显示在整个应用程序上方(类似于 android 设备中的 Developer Options -> Show CPU Usage 设置)。

就我而言,我只是想在应用顶部显示TextView,但您几乎可以用自己的布局替换它。

这是我使用的代码示例:

import android.app.Service;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Binder;
import android.os.IBinder;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.BackgroundColorSpan;
import android.view.WindowManager;
import android.widget.TextView;

public class OverlayService extends Service 

    private final IBinder mBinder = new LocalBinder();
    private TextView mTextView;
    private Spannable mSpannable;

    public class LocalBinder extends Binder 
        public OverlayService getService() 
            return OverlayService.this;
        
    

    @Override
    public IBinder onBind(Intent intent) 
        return mBinder;
    

    @Override
    public void onCreate() 
        super.onCreate();

        mTextView = new TextView(this);
        mTextView.setTextSize(10);
        mTextView.setTextColor(Color.WHITE);

        WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 0 | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(mTextView, params);
    

    public void setText(String text) 

        mSpannable = new SpannableString(text);
        mSpannable.setSpan(new BackgroundColorSpan(0xD993d2b9),0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);           

        // simple logic to only display 10 lines
        if(mTextView.getLineCount() > 10) 
            mTextView.setText(mSpannable);
         else 
            mTextView.append(mSpannable);
        
        mTextView.append("\n");

    

    @Override
    public void onDestroy() 
        super.onDestroy();
        if (mTextView != null) 
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
            wm.removeView(mTextView);
        
    

然后你可以从你的 Activity 中连接这个服务并设置它的文本,像这样:

ServiceConnection mConnection = new ServiceConnection() 

                        @Override
                        public void onServiceConnected(ComponentName className, IBinder service) 
                                LocalBinder binder = (LocalBinder) service;
                                mService = binder.getService();
                        

                        @Override
                        public void onServiceDisconnected(ComponentName arg0) 
                        
                ;

                Intent intent = new Intent(context, OverlayService.class);
                context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
                mService.setText("Sending a test message");

如果您不希望它位于其他应用之上,您当然需要在用户离开应用后立即销毁该服务。

【讨论】:

这不需要权限吗? 啊哈,好点,是的。不记得是哪一个,但我认为是 SYSTEM_ALERT_WINDOW。 我需要一个没有“利用其他应用程序”权限的。 是的,我在回复哈后看到了。如何创建自定义 Toast 消息?您可以将自己的自定义布局添加到 Toast,而且,您几乎可以让 Toast 在任何时间都保持打开状态。这是我几年前开发的一个简单的 hack:github.com/quiqueqs/Toast-Expander 你把我带到了那里。我不认为 Toasts 支持点击事件。也许你可以看看实际的 Toast 源代码,看看你是否至少可以找出其他视图部分之上的视图:github.com/android/platform_frameworks_base/blob/master/core/… 祝你好运!

以上是关于整个应用程序的浮动视图的主要内容,如果未能解决你的问题,请参考以下文章

在 iPad 上创建浮动视图

iOS 11 浮动表格视图标题

可以拖动到视图控制器中的任何位置的浮动按钮?

在 Angular (5) 应用程序中添加浮动按钮的最佳方式是啥?

在应用程序中侦听背景中的触摸事件

禁用 UITableView 浮动部分标题点击?