博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
仿360浮动金币实现
阅读量:6188 次
发布时间:2019-06-21

本文共 7122 字,大约阅读时间需要 23 分钟。

最近也在做下载平台,仿91做了个挖宝功能,现在就来说下浮动金币效果

先实现GoldApplication继承Application

View Code
public class GoldApplication extends Application {    private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();     public WindowManager.LayoutParams getWmParams(){          return wmParams;      }  }

再实现金币类,可以拖动,自动靠边。如果程序结束或Home键回到桌面,就调用dismiss,不然的话金币会一直在桌面上哦。

View Code
public class GoldIcon extends LinearLayout {    private float mTouchRawX;      private float mTouchRawY;     private GestureDetector gestureDetector;    private ImageButton gold;    private WindowManager wm = (WindowManager) getContext().getApplicationContext().getSystemService(Context.WINDOW_SERVICE);    //此wmParams变量为获取的全局变量,用以保存悬浮窗口的属性      private WindowManager.LayoutParams wmParams = ((GoldApplication)getContext().getApplicationContext()).getWmParams();    private int width=0,height=0;//控件宽高    private int DW=0,DH=0,MW=0;//屏幕宽高,屏幕宽的一半        public GoldIcon(Context context) {        super(context);        init(context);        DW=BitmapTools.WH[0];        DH=BitmapTools.WH[1];        MW=DW/2;    }    private void init(Context context)    {        gestureDetector = new GestureDetector(context, gestureListener);        View view = View.inflate(context,R.layout.gold_floatlayout,null);        gold=(ImageButton) view.findViewById(R.id.gold);        gold.setOnClickListener(onClick);        gold.setOnTouchListener(frameOnTouchListener);        this.addView(view);    }    final static int MESSAGE_MOVE = 0x1001;      final static int MESSAGE_DOWN = 0x1002;      final static int MESSAGE_UP = 0x1003;      Handler mHandler = new Handler() {          @Override          public void handleMessage(Message msg) {              switch (msg.what) {              case MESSAGE_MOVE:                  updateViewPosition();                  break;              case MESSAGE_DOWN:                  break;              case MESSAGE_UP:                  updateUpViewPosition();                break;              default:              }          }      };      // 点击Listener      OnTouchListener frameOnTouchListener = new OnTouchListener() {            float x,y;        @Override        public boolean onTouch(View v, MotionEvent event) {              if (null == gestureDetector || null == event) {                  return false;              }              switch(event.getAction())            {                case MotionEvent.ACTION_DOWN:                    x=event.getRawX();                    y=event.getRawY();                    break;                case MotionEvent.ACTION_UP://松手时候靠边                    if(Math.abs(x-event.getRawX())>10&&Math.abs(y-event.getRawY())>10)                    {                        new Thread(new Run()).start();                        return true;                    }                    else                    {                        return false;                    }            }            return gestureDetector.onTouchEvent(event);          }        };  // 手势识别      GestureDetector.OnGestureListener gestureListener = new GestureDetector.OnGestureListener() {            @Override          public boolean onDown(MotionEvent e) {              mTouchRawX = e.getX();              mTouchRawY = e.getY();         //     mHandler.sendEmptyMessage(MESSAGE_MOVE);            return false;          }            @Override          public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,                  float velocityY) {                return true;          }            @Override          public void onLongPress(MotionEvent e) {              // TODO Auto-generated method stub              // Log.d("OnGestureListener", "onLongPress");            }            @Override          public boolean onScroll(MotionEvent e1, MotionEvent e2,                  float distanceX, float distanceY) {              mTouchRawX = e2.getRawX();              mTouchRawY = e2.getRawY();              mHandler.sendEmptyMessage(MESSAGE_MOVE);                return true;          }            @Override          public void onShowPress(MotionEvent e) {  //          Log.d("OnGestureListener", "onShowPress");          }            @Override          public boolean onSingleTapUp(MotionEvent e) {                          return false;          }                };      public void show()    {        gold.setVisibility(View.VISIBLE);    }    public void dismiss()    {        gold.setVisibility(View.GONE);    }    private void updateUpViewPosition() {          wm.updateViewLayout(this, wmParams);      }     private void updateViewPosition() {          // 更新浮动窗口位置参数          getWH();        wmParams.x = (int) mTouchRawX-(width);          wmParams.y = (int) mTouchRawY-(height);          wm.updateViewLayout(this, wmParams);        }     class Run implements Runnable    {        @Override        public void run()         {            while(wmParams.x>=0&&wmParams.x+width<=DW)            {                setWelt();                try {                    Thread.sleep(3);                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }                        mHandler.sendEmptyMessage(MESSAGE_UP);            }            }    private void setWelt()    {        if(wmParams.x+width/2

在要程序启动的首个Activity中

View Code
private WindowManager wm = null;  private WindowManager.LayoutParams wmParams = null;private GoldIcon gold;//仿91浮动金币initGold();
View Code
private void initGold()    {        BitmapTools.WH=BitmapTools.getWindowWidthAddHeight(this);        gold=new GoldIcon(getApplicationContext());        // 获取WindowManager          wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);          // 设置LayoutParams(全局变量)相关参数          wmParams = ((GoldApplication) getApplication()).getWmParams();          /**          * 以下都是WindowManager.LayoutParams的相关属性 具体用途可参考SDK文档          */          wmParams.type =  LayoutParams.TYPE_PHONE;//LayoutParams.TYPE_PHONE; // 设置window type          wmParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明            // 设置Window flag          wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL                  | LayoutParams.FLAG_NOT_FOCUSABLE;            /*          * 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。          * wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |          * LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;          */            wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 调整悬浮窗口至左上角            // 设置悬浮窗口长宽数据          wmParams.width =  android.view.ViewGroup.LayoutParams.WRAP_CONTENT;        wmParams.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT;                 // 显示myFloatView图像          wm.addView(gold, wmParams);      }
View Code
public void goldShow()    {        gold.show();    }    public void goldDismiss()    {        gold.dismiss();    }    public void goToBigger()    {        radio_Digger.setChecked(true);    }

 

View Code
android:name=".GoldApplication"

 

转载于:https://www.cnblogs.com/helloandroid/archive/2013/04/10/3011776.html

你可能感兴趣的文章
QTP引用外部脚本路径的设定(三)Instr函数的使用
查看>>
Linux 监控工具之Cacti使用详解(四)
查看>>
机房管理系列之共享打印服务器
查看>>
ORACLE_OCM.MGMT_DB_LL_METRICS报错
查看>>
文件服务器的配置与管理(3) 共享文件夹的创建与使用
查看>>
Windows快捷方式
查看>>
Essential Linux Device Driver附录A . Linux汇编
查看>>
eclipse导入的工程莫名报错误
查看>>
[Android]基于RxJava、RxAndroid的EventBus实现
查看>>
细说Linq之Aggregate
查看>>
Gradle 提速:每天为你省下一杯喝咖啡的时间
查看>>
《iOS 核心动画高级技巧》笔记
查看>>
前端小知识10点(2019.5.18)
查看>>
Tensorflow minist-softmax
查看>>
Kotlin中的also、let、run、with、apply函数的用法
查看>>
常用 Markdown 语法汇总
查看>>
12、Flutter Widget - InheritedModel;
查看>>
VR全景创业:这些创业条件你具备了吗?
查看>>
WEB前端学习如何分清主次和优先级?
查看>>
小程序·云开发——正在悄悄改变小程序开发的模式
查看>>