android中懸浮顯示可拖動的工具欄
下面的示例是仿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(); } } </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959614223407056575" target="_blank"></a></div>
</div> </div>
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); } } </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959614223407056575" target="_blank"></a></div>
</div> </div>
布局xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns: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> </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959614223407056575" target="_blank"></a></div>
</div> </div>
權限:
</div> </div> 來自:http://blog.csdn.net/u010142437/article/details/17509587<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關經驗
相關資訊
相關文檔
目錄
sesese色