android 一直在最前面的浮動視窗效果

來源:互聯網
上載者:User

今天發現一些軟體可以在android 的案頭上顯示一些浮動小視窗,經過一番尋找,終於找到的解決方案,代碼如下:

 

 

FloatingFunc.java

 

package hrxcframe.comm;

import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.test.R;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;

/**
 * 可以永遠顯示在android螢幕最上方的浮動菜單
 *
 * @author liujl v1.0 需要添加 <uses-permission
 *         android:name="android.permission.SYSTEM_ALERT_WINDOW"
 *         /><!--系統快顯視窗許可權-->許可權不然會報錯
 */
public class FloatingFunc {
    /**
     * 浮動視窗在螢幕中的x座標
     */
    private static float x = 0;
    /**
     * 浮動視窗在螢幕中的y座標
     */
    private static float y = 200;
    /**
     * 螢幕觸摸狀態,暫時未使用
     */
    private static float state = 0;
    /**
     * 滑鼠觸摸開始位置
     */
    private static float mTouchStartX = 0;
    /**
     * 滑鼠觸摸結束位置
     */
    private static float mTouchStartY = 0;
    /**
     * windows 視窗管理器
     */
    private static WindowManager wm = null;

    /**
     * 浮動顯示對象
     */
    private static View floatingViewObj = null;

    /**
     * 參數設定類
     */
    public static WindowManager.LayoutParams params = new WindowManager.LayoutParams();
    public static int TOOL_BAR_HIGH = 0;
    /**
     * 要顯示在視窗最前面的對象
     */
    private static View view_obj = null;

    /**
     * 要顯示在視窗最前面的方法
     *
     * @param context
     *            調用對象Context getApplicationContext()
     * @param window
     *            調用對象 Window getWindow()
     * @param floatingViewObj
     *            要顯示的浮動物件 View
     */
    public static void show(Context context, Window window, View floatingViewObj) {
        // 載入xml檔案中樣式例子代碼
        // ********************************Start**************************
        // LayoutInflater inflater =
        // LayoutInflater.from(getApplicationContext());
        // View view = inflater.inflate(R.layout.topframe, null);
        // wm =
        // (WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
        // 載入xml檔案中樣式例子代碼
        // *********************************End***************************
        //
        // 關閉浮動顯示對象然後再顯示
        close(context);
        FloatingFunc.floatingViewObj = floatingViewObj;

        view_obj = floatingViewObj;
        Rect frame = new Rect();
        // 這一句是關鍵,讓其在top 層顯示
        // getWindow()
        window.getDecorView().getWindowVisibleDisplayFrame(frame);
        TOOL_BAR_HIGH = frame.top;

        wm = (WindowManager) context// getApplicationContext()
                .getSystemService(Activity.WINDOW_SERVICE);
        params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
                | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
        params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
                | LayoutParams.FLAG_NOT_FOCUSABLE;

        // 設定懸浮視窗長寬資料
        params.width = WindowManager.LayoutParams.WRAP_CONTENT;
        params.height = WindowManager.LayoutParams.WRAP_CONTENT;
        // 設定透明度
        params.alpha = 80;
        // 設定內部文字對齊
        params.gravity = Gravity.LEFT | Gravity.TOP;

        // 以螢幕左上方為原點,設定x、y初始值ֵ
        params.x = (int) x;
        params.y = (int) y;
        // tv = new MyTextView(TopFrame.this);
        wm.addView(floatingViewObj, params);

    }

    /**
     * 跟誰滑動移動
     *
     * @param event
     *            事件對象
     * @param view
     *            彈出對象執行個體(View)
     * @return
     */
    public static boolean onTouchEvent(MotionEvent event, View view) {

        // 擷取相對螢幕的座標,即以螢幕左上方為原點
        x = event.getRawX();
        y = event.getRawY() - 25; // 25是系統狀態列的高度
        Log.i("currP", "currX" + x + "====currY" + y);// 調試資訊
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            state = MotionEvent.ACTION_DOWN;
            // panTime();
            // 擷取相對View的座標,即以此View左上方為原點
            mTouchStartX = event.getX();
            mTouchStartY = event.getY();
            Log.i("startP", "startX" + mTouchStartX + "====startY"
                    + mTouchStartY);// 調試資訊

            break;
        case MotionEvent.ACTION_MOVE:
            state = MotionEvent.ACTION_MOVE;
            updateViewPosition(view);
            break;

        case MotionEvent.ACTION_UP:
            state = MotionEvent.ACTION_UP;
            updateViewPosition(view);
            mTouchStartX = mTouchStartY = 0;
            break;
        }
        return true;
    }

    /**
     * 關閉浮動顯示對象
     */
    public static void close(Context context) {

        if (view_obj != null && view_obj.isShown()) {
            WindowManager wm = (WindowManager) context
                    .getSystemService(Activity.WINDOW_SERVICE);
            wm.removeView(view_obj);
        }
    }

    /**
     * 更新快顯視窗位置
     */
    private static void updateViewPosition(View view) {
        // 更新浮動視窗位置參數
        params.x = (int) (x - mTouchStartX);
        params.y = (int) (y - mTouchStartY);
        wm.updateViewLayout(FloatingFunc.floatingViewObj, params);
    }

}

 

 

 

測試代碼,放到任意的 Activity 代碼裡就可以,可以用手拖動位置

 

final TextView tv = new TextView(getApplicationContext());
                tv.setText("http://www.my400800.cn ");
                view.setOnTouchListener(new View.OnTouchListener() {
                   
                    @Override
                    public boolean onTouch(View arg0, MotionEvent arg1) {
                        FloatingFunc.onTouchEvent(arg1, tv);
                        return true;
                    }
                });

 

 

效果如下:

 

注意事項:

 

一定要在AndroidManifest.xml添加

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

系統許可權,不然會出錯的呀。。。。。。。。。。。。。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.