蹭一波热度:记微信跳一跳辅助线开发
蹭一波热度:记微信跳一跳辅助线开发
场景
前两天下午三点多时候,老板突然一个电话过来:“那个小甘啊,最近微信跳一跳小游戏很火啊,我们现在已经有了全自动脚本了,现在需要一个提升用户参与感的辅助工具,就是需要一条辅助线来帮助用户得到更高分,这个东西你来做一下,务必用最短的时间把它实现了。”唉,那么没办法只能开撸了。基本思路
既然是辅助线,那么肯定是在所有窗口的前面,看到这个自然就想到了利用WindowManager来实现一个悬浮在所有窗口前面的Window,利用Service在后台不断更新小人头部的坐标,通过监听手指按下和弹起不断在Window中addView和removeView来绘制辅助线。Tips:监听手指在屏幕上的事件和不断寻找小人头部坐标是Native以前实现好的成熟方案=。=这里我并不会。编码实现
1.Service关键代码
创建没有事件的悬浮窗
private void createToucher() {//赋值WindowManager&LayoutParam.params = new WindowManager.LayoutParams();windowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);//设置type.系统提示型窗口,一般都在应用程序窗口之上.params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;//设置效果为背景透明.params.format = PixelFormat.RGBA_8888;//设置flags.不可聚焦及不可使用按钮对悬浮窗进行操控.params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE| WindowManager.LayoutParams.FLAG_FULLSCREEN;//设置窗口初始停靠位置.params.gravity = Gravity.LEFT | Gravity.TOP;params.x = 0;params.y = 0;params.width = WindowManager.LayoutParams.WRAP_CONTENT;params.height = WindowManager.LayoutParams.WRAP_CONTENT;}
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE这三个标记很重要,不加会拦截事件,导致其他窗口无法响应事件。
监听手指按下与弹起并绘制辅助线
@Overridepublic void onTouchDown() { /*手指按下时开始画线*/try {if (point.x != -1 && point.y != -1) {lineView = new LineView(DrawLineService.this);lineView.start(point.x, point.y);windowManager.addView(lineView, params);}} catch (Exception ignored) {}}
@Overridepublic void onTouchUp() {try { /*手指弹起时释放画线*/lineView.stop();windowManager.removeView(lineView);} catch (Exception ignored) {}}
2.辅助线的View
public class LineView extends View {private static final float SPEED_X = 0.60f / 1080f;private static final float SPEED_Y = 0.35f / 1920f;private float mx, my, incrementY, incrementX;private int mWidth;private int mHeight;private long startTime;private Timer mTimer = new Timer();TimerTask mTimerTask;Paint p;private float mHeadOffset;public static float gOffset = 1f;/*因为底层接口返回的是小人头部坐标 线需要从脚部开始划 所以需要调整*/private float mDefaultHeadOffset = 40f; public LineView(Context context) {super(context);init();}private void init() {DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();mWidth = displayMetrics.widthPixels;mHeight = displayMetrics.heightPixels;p = new Paint();p.setColor(Color.RED);p.setAntiAlias(true);p.setStrokeWidth(10.0f);mHeadOffset = ConvertUtils.dip2px(getContext(), mDefaultHeadOffset);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawLine(mx, my, incrementX, incrementY, p);// 斜线}/*** 手指按压住以后该方法执行,内部使用TimerTask完成直线绘制** @param x 小人头部x坐标* @param y 小人头部y坐标*/public void start(float x, float y) {startTime = System.currentTimeMillis();y += mHeadOffset; /*小人脚部y坐标*/this.incrementX = x;this.incrementY = y;this.mx = x;this.my = y;if (isRight(mx)) {mTimerTask = new TimerTask() {@Overridepublic void run() {float ellapsed = System.currentTimeMillis() - startTime;/*** tips:0.35和0.60是根据测试结果调出来的 需要根据实际情况优化*/incrementY = my - ellapsed * SPEED_Y * mHeight * gOffset; /* y / x = 0.58*/incrementX = mx - ellapsed * SPEED_X * mWidth * gOffset;postInvalidate();}};} else {mTimerTask = new TimerTask() {@Overridepublic void run() {float ellapsed = System.currentTimeMillis() - startTime;incrementY = my - ellapsed * SPEED_Y * mHeight * gOffset;incrementX = mx + ellapsed * SPEED_X * mWidth * gOffset;postInvalidate();}};}/*每隔10ms绘制一次*/mTimer.schedule(mTimerTask, 0, 10);}/*** 手指松开时调用该方法,调用时停止画线*/public void stop() {mTimerTask.cancel();mTimerTask = null;}/*** 判断当前小人在左边还是右边(根据左右来判断斜线往哪边画)* @return true 右边 false坐标*/private boolean isRight(float x) {WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);int width = wm.getDefaultDisplay().getWidth();if (x < width / 2) {return false; //left} else {return true;}}
}
- 最后附上效果图
蹭一波热度:记微信跳一跳辅助线开发相关推荐
- c语言微信跳一跳辅助开发程序
一.开发环境 开发环境 使用语言:C/C++ IDE:VS2010+ 其他三方库 EasyX(http://www.easyx.cn/downloads/) ADB(链接: https://pan.b ...
- python微信跳一跳_[小白教程] 用Python占领微信跳一跳排行榜
文/帅朋 微信新版 6.6.1 加入了「跳一跳」这个游戏功能,并迅速在朋友圈之间火了起来.很多人为了能够跳到更高的分数而努力的奋斗着.那么今天我就来蹭一蹭「跳一跳」的热度,给大家提供一个方法让你快速的 ...
- 微信跳一跳高分辅助踩坑
旧博文,搬到 csdn 原文:http://rebootcat.com/2018/01/08/wechat_jump_hack/ 最近挺火的微信跳一跳 最近新版微信的『跳一跳』小程序着实火了一把,也把 ...
- 微信跳一跳(学习笔记)
最近,微信跳一跳风靡朋友圈,Github上又有大佬用Python写出自动外挂,就因为感兴趣学习了一波还是有点难理解,不过主要还是去了解编程思想的,也算学习一下.下面是主要关键的学习代码(运行不了不完整 ...
- “Python来玩微信跳一跳”教程(问题总结)
原文:<"Python来玩微信跳一跳"教程> 在上一篇文章中,收到了大家大量的问题反馈,因为问题比较多,并且有很多重复的问题,所以并没有一一回复,这里表示一下歉意,并整 ...
- 跳一跳python源码下载_微信跳一跳python代码实现
本文实例为大家分享了python微信跳一跳的具体代码,供大家参考,具体内容如下 部分代码分享: wechat_jump.py from __future__ import print_function ...
- AI 玩微信跳一跳的正确姿势:跳一跳 Auto-Jump 算法详解
作者丨安捷 & 肖泰洪 学校丨北京大学硕士生 研究方向丨计算机视觉 本文经授权转载自知乎专栏「学术兴趣小组」. 最近,微信小游戏跳一跳可以说是火遍了全国,从小孩子到大孩子仿佛每一个人都在刷跳一 ...
- 微信跳一跳高分系列四:一个 JAVA 版开源的微信跳一跳辅助工具
基于前三篇文章,我们一起来制作一个自动化工具,解放劳动力,通过机器自动完成跳一跳 wechat-jump-helper 一款JAVA版开源的微信跳一跳小程序辅助工具 传送门一:wechat-jump- ...
- 微信跳一跳高分系列三:用 adb 破解微信跳一跳小程序
写在前面:网上关于微信跳一跳的文章已有很多,写这篇的目的是对 adb 工具的一个熟悉过程,也是对未入门的新朋友的一个引导 步骤: 1.保存当前跳一跳页的截图到手机 adb shell screenca ...
最新文章
- 为什么静态成员、静态方法中不能用this和super关键字
- clickhouse原理解析与开发实战 pdf_Spring全家桶集合:SpringBoot+SpringCloud实战,Spring源码原理...
- _beginthreadex 一定要自己写 CloseHandle 可以不用 _endthreadex
- Java植物名录程序_程序员用Java语言编写多线程应用程序,程序员能控制的关键性工作有两个方面:一是编写线程的_________方法;二是建立线程实例。...
- 解决http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
- iphone/ipod网页开发教程及规则
- 【ASK】设置网卡启动遇到的事!
- 【转载】关于网页尺寸的设置
- C# XML文件操作类XmlHelper
- html中图片连续替换,C# 批量替换html中的图片 示例
- java 读取excel 文件 Unable to recognize OLE stream 错误
- (Kinetis K60) FTM输出PWM
- 地理信息系统概论 黄杏元版 期末复习资料
- REST Assured 5 - Abstraction抽象,隐藏实现
- oracle设置查看格式,Oracle 设置显示格式
- 操作系统进程同步例题(四)生产者-消费者问题
- win10 子系统之 Ubuntu,解放你的生产力
- JAVA学习【IDEA转中文】
- Python对象的浅拷贝与深拷贝
- python qt 按钮_Python QtWidgets.QPushButton方法代码示例