分享到:
点击次数:333  更新时间:2016-10-11 16:24:04  【打印此页】  【关闭
澳门新濠天地娱乐场澳门新濠天地娱乐定制
当前位置:主页 > 新闻动态 > 技术交流 > android中悬浮显示可拖动的工具栏

android中悬浮显示可拖动的工具栏

责任编辑:admin 发布时间:2016-11-11 09:15 浏览次数:

下面的示例是仿QQ音乐之类的歌词栏,可以进行拖动和隐藏,代码如下:
MainActivity:
    package com.home.danglingactivity; 
     
    import android.app.Activity; 
    import android.content.Context; 
    import android.graphics.Rect; 
    import android.os.Bundle; 
    import android.view.Gravity; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.view.Window; 
    import android.view.WindowManager; 
    import android.view.WindowManager.LayoutParams; 
    import android.widget.Button; 
     
    public class MainActivity extends Activity implements OnClickListener { 
        private MyTextView tv; 
        private Button btn; 
     
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            requestWindowFeature(Window.FEATURE_NO_TITLE); 
            setContentView(R.layout.activity_main); 
            btn = (Button) findViewById(R.id.main_btn); 
            btn.setOnClickListener(this); 
        } 
     
        @Override 
        public void onClick(View v) { 
            if (tv != null && tv.isShown()) { 
                hide(); 
            } else { 
                show(); 
            } 
        } 
     
        /**
         * 隐藏显示歌词的TextView
         */ 
        private void hide() { 
            WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 
            wm.removeView(tv); 
            btn.setText("显示歌词"); 
        } 
     
        /**
         * 显示悬浮的TextView
         */ 
        private void show() { 
            Rect frame = new Rect(); 
            getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); 
            MyTextView.TOOL_BAR_HIGH = frame.top; 
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
            WindowManager.LayoutParams params = MyTextView.params; 
     
            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.FILL_PARENT; 
            params.height = WindowManager.LayoutParams.WRAP_CONTENT; 
            params.alpha = 80; 
            params.gravity = Gravity.LEFT | Gravity.TOP; 
            // 设置x、y初始值 
            params.x = 0; 
            params.y = wm.getDefaultDisplay().getHeight(); 
     
            tv = new MyTextView(MainActivity.this); 
            wm.addView(tv, params); 
            btn.setText("隐藏歌词"); 
        } 
     
        @Override 
        protected void onDestroy() { 
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
            if (tv != null && tv.isShown()) { 
                wm.removeView(tv); 
            } 
            super.onDestroy(); 
        } 
     
    } 
MyTextView:
    package com.home.danglingactivity; 
     
    import android.content.Context; 
    import android.graphics.Canvas; 
    import android.graphics.Color; 
    import android.graphics.LinearGradient; 
    import android.graphics.Paint; 
    import android.graphics.Shader; 
    import android.graphics.Shader.TileMode; 
    import android.graphics.Typeface; 
    import android.view.MotionEvent; 
    import android.view.WindowManager; 
    import android.widget.TextView; 
     
    public class MyTextView extends TextView { 
        private final String TAG = MyTextView.class.getSimpleName(); 
        public static int TOOL_BAR_HIGH = 0; 
        public static WindowManager.LayoutParams params = new WindowManager.LayoutParams(); 
        private float startX; 
        private float startY; 
        private float x; 
        private float y; 
        private String text = "我是不是你最疼爱的人,你为什么不说话,握住是你冰冷的手动也不动让我好难过";; 
        private float float1 = 0.0f; 
        private float float2 = 0.01f; 
        WindowManager wm = (WindowManager) getContext().getApplicationContext() 
                .getSystemService(Context.WINDOW_SERVICE); 
     
        public MyTextView(Context context) { 
            super(context); 
            this.setBackgroundColor(Color.argb(100, 140, 160, 150)); 
        } 
     
        @Override 
        public boolean onTouchEvent(MotionEvent event) { 
            // 触摸点相对于屏幕左上角坐标 
            x = event.getRawX(); 
            y = event.getRawY() - TOOL_BAR_HIGH; 
            switch (event.getAction()) { 
            case MotionEvent.ACTION_DOWN: 
                startX = event.getX(); 
                startY = event.getY(); 
                break; 
            case MotionEvent.ACTION_MOVE: 
                updatePosition(); 
                break; 
            case MotionEvent.ACTION_UP: 
                updatePosition(); 
                startX = startY = 0; 
                break; 
            } 
            return true; 
        } 
     
        @Override 
        protected void onDraw(Canvas canvas) { 
            super.onDraw(canvas); 
            float1 += 0.001f; 
            float2 += 0.001f; 
            if (float2 > 1.0) { 
                float1 = 0.0f; 
                float2 = 0.01f; 
            } 
            this.setText(""); 
            float len = this.getTextSize() * text.length(); 
            Shader shader = new LinearGradient(0, 0, len, 0, new int[] { 
                    Color.YELLOW, Color.RED }, new float[] { float1, float2 }, 
                    TileMode.CLAMP); 
            Paint p = new Paint(); 
            p.setShader(shader); 
            p.setTypeface(Typeface.DEFAULT_BOLD); 
            canvas.drawText(text, 0, 10, p); 
        } 
     
        /**
         * 更新浮动窗口位置参数
         */ 
        private void updatePosition() { 
            // View的当前位置 
            params.x = (int) (x - startX); 
            params.y = (int) (y - startY); 
            wm.updateViewLayout(this, params); 
        } 
    } 
布局xml:
    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:orientation="vertical" > 
     
        <Button 
            android:id="@+id/main_btn" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:layout_gravity="center" 
            android:text="显示歌词" /> 
     
    </LinearLayout> 
权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />