android中的浮动小部件/弹出窗口

时间:2014-12-30 19:32:34

标签: android popupwindow

开发一个应用程序,当收到调用时应该出现浮动组件,组件将有几个按钮来执行必要的操作。 我试过以下。 我实现了一个弹出窗口,主要活动是半透明的。当这个组件弹出时,我能够在屏幕上移动它,但由于活动是半透明的,我无法执行任何enter image description here其他活动。

在这里你可以看到弹出窗口,我可以移动它,但我无法在后台滚动menudrawer。我如何以这样的方式实现我可以执行两种操作,即在弹出窗口和后台屏幕上。

我的代码

`public class MainActivity extends Activity {
    int mCurrentX;
    int mCurrentY;
     private float mDx;
     private float mDy;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
         final View cv = new View(this);


            TextView tv = new TextView(this);
            tv.setBackgroundColor(0xffeeeeee);
            tv.setTextColor(0xff000000);
            tv.setTextSize(24);
            tv.setText("click me\nthen drag me");
            tv.setPadding(8, 8, 8, 8);
          final PopupWindow  mPopup = new PopupWindow(tv, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            OnTouchListener otl = new OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    // TODO Auto-generated method stub
                    int action = event.getAction();

                    if (action == MotionEvent.ACTION_DOWN) {
                        mDx = mCurrentX - event.getRawX();
                        mDy = mCurrentY - event.getRawY();
                    } else
                    if (action == MotionEvent.ACTION_MOVE) {
                        mCurrentX = (int) (event.getRawX() + mDx);
                        mCurrentY = (int) (event.getRawY() + mDy);
                        mPopup.update(mCurrentX, mCurrentY, -1, -1);

                    }
                    return true;
                }
            };
            tv.setOnTouchListener(otl);

            mCurrentX = 20;
            mCurrentY = 50;

            cv.post(new Runnable() {
                @Override
                public void run() {
                    mPopup.showAtLocation(cv, Gravity.NO_GRAVITY, mCurrentX, mCurrentY);
                }
            });
    }

}`

清单

`<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">

        <activity android:name=".MainActivity"
                  android:theme="@android:style/Theme.Translucent.NoTitleBar"
                  android:label="@string/app_name"
                  android:configChanges="orientation|screenSize"
                  android:windowSoftInputMode="adjustResize|stateAlwaysHidden">

            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>

        </activity>

               <activity
                android:name="PopupMainActivity"
                android:label="@string/app_name"
                android:theme="@style/Theme.FloatingWindow.Popup"
                android:configChanges="orientation|screenSize"
                android:windowSoftInputMode="adjustResize|stateAlwaysHidden"
                android:clearTaskOnLaunch="true"
                android:exported="true"
                tools:ignore="ExportedActivity" />

    </application>`

请帮我解决这个问题。我想在整体上实现一个小部件组件。谢谢!

1 个答案:

答案 0 :(得分:1)

您必须启动前台服务并使用WindowManager在其他所有内容上绘制,管理您的弹出窗口位置,大小等...

WindowManger windowManager = Context.getSystemService(Context.WINDOW_SERVICE);

您还必须添加此权限&#34; android.permission.SYSTEM_ALERT_WINDOW&#34;到你的清单。

更简单的解决方案是使用名为StandOut的库,它基本上处理了我上面提到的所有内容,并提供了额外的功能,如:

  • 窗口装饰器(标题栏,最小化/关闭按钮,边框,调整大小句柄)
  • Windows可移动且可调整大小。你可以带到前面,尽量减少,
  • 可以恢复最小化的窗口(示例APK演示使用此功能 通知面板)
  • 创建多种类型的窗口,以及每种类型的多个窗口