跑马灯和悬浮窗口

来源:互联网 发布:淘宝买的图纸可信吗 编辑:程序博客网 时间: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中启动悬浮窗口,怎么在应用退出时隐藏窗口。



原创粉丝点击