跑马灯和悬浮窗口
来源:互联网 发布:淘宝买的图纸可信吗 编辑:程序博客网 时间:2024/05/22 00:15
自定义类:package com.xxx.ross;import android.content.Context;import android.graphics.Rect;import android.util.AttributeSet;import android.widget.TextView;public class MarqueeTextView extends TextView { public MarqueeTextView(Context appCon) { super(appCon); } public MarqueeTextView(Context context, AttributeSet attrs) { super(context, attrs); } public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean isFocused() { return true; } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { }}
主Activity:
package com.xxx.ross;import android.app.Activity;import android.os.Bundle;import android.util.DisplayMetrics;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.ViewGroup.LayoutParams;import android.view.WindowManager;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class TestFloatWindowActivity extends Activity {private boolean change;WindowManager wm;WindowManager.LayoutParams wmParams; View view; private float mTouchStartX; private float mTouchStartY; private float x; private float y; DisplayMetrics dm; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); change = true; final TextView tv = (TextView) this.findViewById(R.id.tv); Button btn = (Button) this.findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {if(change){tv.setText("天生我才必有用,千金散尽还复来");change = false;}else{tv.setText("人生得意须尽欢,莫使金樽空对月");change = true;}} }); view=new Button(getApplicationContext()); ((Button) view).setText("float win"); wm=(WindowManager)getApplicationContext().getSystemService("window"); wmParams = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); /** *以下都是WindowManager.LayoutParams的相关属性 * 具体用途请参考SDK文档 */ wmParams.type=2002; //这里是关键,你也可以试试2003 wmParams.format=1; wmParams.gravity = Gravity.RIGHT|Gravity.BOTTOM; /** *这里的flags也很关键 *代码实际是wmParams.flags |= FLAG_NOT_FOCUSABLE; *40的由来是wmParams的默认属性(32)+ FLAG_NOT_FOCUSABLE(8) */ wmParams.flags=40; wmParams.width=200; wmParams.height=100; view.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // 获取相对屏幕的坐标,即以屏幕左上角为原点 x = event.getRawX(); // 25是系统状态栏的高度,也可以通过方法得到准确的值,自己微调就是了 y = event.getRawY()-25 ; // matrix change (x,y)--->(x',y') x = dm.widthPixels-x; y = dm.heightPixels-y; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 获取相对View的坐标,即以此View左上角为原点 mTouchStartX = event.getX(); mTouchStartY = event.getY()+view.getHeight()/2; break; case MotionEvent.ACTION_MOVE: updateViewPosition(); break; case MotionEvent.ACTION_UP: updateViewPosition(); mTouchStartX = mTouchStartY = 0; break; } return true; } }); }private void updateViewPosition() { // 更新浮动窗口位置参数 wmParams.x = (int) (x - mTouchStartX); wmParams.y = (int) (y - mTouchStartY); wm.updateViewLayout(view, wmParams);} @Overridepublic void onResume(){super.onResume(); wm.addView(view, wmParams); //创建View} @Override public void onPause(){ super.onPause(); wm.removeView(view); } }
main.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /><Button android:id="@+id/btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="change Text"/> <com.digit.ross.MarqueeTextViewandroid:id="@+id/tv" android:layout_width="100px" android:layout_height="wrap_content" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:scrollHorizontally="true" android:text="人生得意须尽欢,莫使金樽空对月" /></LinearLayout>
permission:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
基本都是网上找来的,可以用,我一直在考虑如果我在Application中启动悬浮窗口,怎么在应用退出时隐藏窗口。
- 跑马灯和悬浮窗口
- Android TextView跑马灯+悬浮窗口
- WindowManager 和window 悬浮窗口
- 悬浮窗口
- 悬浮窗口
- 悬浮窗口
- 悬浮窗口
- 悬浮窗口
- 【Android】WindowManager悬浮窗口 分析和示例
- Android中悬浮窗口的实现原理和示例代码
- Android中悬浮窗口的实现原理和示例代码
- Android中悬浮窗口的实现原理和示例代码
- Android中悬浮窗口的实现原理和示例代码
- Android中悬浮窗口的实现原理和示例代码
- Delphi实现网络蚂蚁和FlashGet的悬浮窗口,拖动
- Android中悬浮窗口的实现原理和示例代码
- Android中悬浮窗口的实现原理和示例代码
- Android中悬浮窗口的实现原理和示例代码
- 软件标书中一些常用的技术描述总结
- 解决CMS在IE8下模式窗口下操作又开启新窗口
- mysql字符串函数
- 2012年10月10号PPS笔试题目(c++开发)
- Mysql 几种连接的区别
- 跑马灯和悬浮窗口
- VM cannot start because the saved state Error。。。解决办法
- 程序员面试真经
- 網頁遮罩(鎖左、右鍵)的非JS方法
- 相约世纪末
- vi
- 穿越混合云模型鸿沟
- 将数字转换成大写
- 在开始的路上