广告
返回顶部
首页 > 资讯 > 精选 >Android辅助功如何实现自动抢红包
  • 932
分享到

Android辅助功如何实现自动抢红包

android 2023-05-30 18:05:03 932人浏览 八月长安
摘要

这篇文章主要介绍Android辅助功如何实现自动抢红包,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、描述最近看到同事有用抢红包的软件,就想看看抢红包的具体实现是如何的,所以了解了一下,有用辅助功能实现的,所以在下

这篇文章主要介绍Android辅助功如何实现自动抢红包,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一、描述

最近看到同事有用抢红包的软件,就想看看抢红包的具体实现是如何的,所以了解了一下,有用辅助功能实现的,所以在下面的示例中会展示一个抢红包的小Demo,附带源码抢红包源码。

二、效果图

Android辅助功如何实现自动抢红包

在桌面收到红包进行抢

Android辅助功如何实现自动抢红包

在聊天页面收到口令红包

三、AccessibilityService使用

创建辅助服务类,继承AccessibilityService,实现两个接口,接收系统的事件

public class MyService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) {   } @Override public void onInterrupt() {   }}

辅助服务的配置文件,配置事件,在 res/xml下创建accessibility_service_info.xml

//具体属性的说明在第5点有说明<?xml version="1.0" encoding="utf-8"?><accessibility-service xmlns:android="Http://schemas.android.com/apk/res/android" android:description="@string/accessibility_service_description" android:accessibilityEventTypes="typeAllMask" android:accessibilityFeedbackType="feedbackGeneric" android:notificationTimeout="100" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true" android:packageNames="top.cokernut.sample" android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" />

注册Service辅助服务,并且为Service附加上第二步创建的xml,看清除下面的一些属性,必须要加,如果有的没加的话是没效果的

<service   android:name=".MyService"   android:label="辅助功能"   android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">   <intent-filter>    <action android:name="android.accessibilityservice.AccessibilityService" />   </intent-filter>   <meta-data    android:name="android.accessibilityservice"    android:resource="@xml/accessibility_service_info" />  </service>

4 清单文件中添加权限

 <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />

辅助服务配置文件xml属性说明:

//是否可以检索整个层级下的内容android:canRetrieveWindowContent="true"级下的信息//事件通知触发点,比如窗口打开,滑动,焦点变化,长按等。android:accessibilityEventTypes="typeAllMask"#TYPES_ALL_MASK:所有类型#TYPE_VIEW_CLICKED :单击#TYPE_VIEW_LONG_CLICKED :长按#TYPE_VIEW_SELECTED :选中#TYPE_VIEW_FOCUSED :获取焦点#TYPE_VIEW_TEXT_CHANGED :文字改变#TYPE_WINDOW_STATE_CHANGED :窗口状态改变//表示反馈方式,比如是语音播放,还是震动android:accessibilityFeedbackType="feedbackGeneric"//接受事件的时间间隔,通常将其设置为100即可.android:notificationTimeout="100"//表示该服务是用来单独监听哪个应用的产生的事件,其他的都会过滤,如果不填就是对所有的应用进行监听,填入包名即可。android:packageNames="top.cokernut.sample"//在代码中我们就可以通过node节点来getViewIdResourceName()获取对应的节点的idandroid:accessibilityFlags="flagDefault"

提供一个AccessibilityService的基类,集成了一些常用方法:

public class BaseAccessibilityService extends AccessibilityService { private AccessibilityManager MaccessibilityManager; private Context mContext; private static BaseAccessibilityService mInstance; public void init(Context context) {  mContext = context.getApplicationContext();  mAccessibilityManager = (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE); } public static BaseAccessibilityService getInstance() {  if (mInstance == null) {   mInstance = new BaseAccessibilityService();  }  return mInstance; }  private boolean checkAccessibilityEnabled(String serviceName) {  List<AccessibilityServiceInfo> accessibilityServices =    mAccessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);  for (AccessibilityServiceInfo info : accessibilityServices) {   if (info.getId().equals(serviceName)) {    return true;   }  }  return false; }  public void GoAccess() {  Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  mContext.startActivity(intent); }  public void perfORMViewClick(AccessibilityNodeInfo nodeInfo) {  if (nodeInfo == null) {   return;  }  while (nodeInfo != null) {   if (nodeInfo.isClickable()) {    nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);    break;   }   nodeInfo = nodeInfo.getParent();  } }  public void performBackClick() {  try {   Thread.sleep(500);  } catch (InterruptedException e) {   e.printStackTrace();  }  performGlobalAction(GLOBAL_ACTION_BACK); }  public void performScrollBackward() {  try {   Thread.sleep(500);  } catch (InterruptedException e) {   e.printStackTrace();  }  performGlobalAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); }  public void performScrollForward() {  try {   Thread.sleep(500);  } catch (InterruptedException e) {   e.printStackTrace();  }  performGlobalAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); }  public AccessibilityNodeInfo findViewByText(String text) {  return findViewByText(text, false); }  public AccessibilityNodeInfo findViewByText(String text, boolean clickable) {  AccessibilityNodeInfo accessibilityNodeInfo = getRootInActiveWindow();  if (accessibilityNodeInfo == null) {   return null;  }  List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByText(text);  if (nodeInfoList != null && !nodeInfoList.isEmpty()) {   for (AccessibilityNodeInfo nodeInfo : nodeInfoList) {    if (nodeInfo != null && (nodeInfo.isClickable() == clickable)) {     return nodeInfo;    }   }  }  return null; }  @Targetapi(Build.VERSION_CODES.JELLY_BEAN_MR2) public AccessibilityNodeInfo findViewByID(String id) {  AccessibilityNodeInfo accessibilityNodeInfo = getRootInActiveWindow();  if (accessibilityNodeInfo == null) {   return null;  }  List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId(id);  if (nodeInfoList != null && !nodeInfoList.isEmpty()) {   for (AccessibilityNodeInfo nodeInfo : nodeInfoList) {    if (nodeInfo != null) {     return nodeInfo;    }   }  }  return null; } public void clickTextViewByText(String text) {  AccessibilityNodeInfo accessibilityNodeInfo = getRootInActiveWindow();  if (accessibilityNodeInfo == null) {   return;  }  List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByText(text);  if (nodeInfoList != null && !nodeInfoList.isEmpty()) {   for (AccessibilityNodeInfo nodeInfo : nodeInfoList) {    if (nodeInfo != null) {     performViewClick(nodeInfo);     break;    }   }  } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public void clickTextViewByID(String id) {  AccessibilityNodeInfo accessibilityNodeInfo = getRootInActiveWindow();  if (accessibilityNodeInfo == null) {   return;  }  List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId(id);  if (nodeInfoList != null && !nodeInfoList.isEmpty()) {   for (AccessibilityNodeInfo nodeInfo : nodeInfoList) {    if (nodeInfo != null) {     performViewClick(nodeInfo);     break;    }   }  } }  public void inputText(AccessibilityNodeInfo nodeInfo, String text) {  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {   Bundle arguments = new Bundle();   arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);   nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);  } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {   ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);   ClipData clip = ClipData.newPlainText("label", text);   clipboard.setPrimaryClip(clip);   nodeInfo.performAction(AccessibilityNodeInfo.ACTION_FOCUS);   nodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE);  } } @Override public void onAccessibilityEvent(AccessibilityEvent event) { } @Override public void onInterrupt() { }}

四、QQ抢红包

(一)抢红包流程:

  1. 通知栏收到QQ的消息,发现是QQ红包,模拟点击消息进入聊天页面

  2. 检索页面上的所有元素,发现有包含“点击拆开”的字眼,就模拟点击打开红包窗口

  3. 一两秒后执行Back操作,关闭红包窗口。

  4. 继续等待消息来到。

(二)实现功能:

  1. 屏抢红包(不可以有密码或者图案之类的锁屏)

  2. 口令红包,自动输入口令并且发送

  3. 抢完红包后,自动回复感谢语,可在红包设置里自行设置内容

  4. 其他的功能就没继续往下做了,知道方法,其他都可能慢慢研究出来。

(三)抢红包辅助功能类,注释都写好了,很好理解,类中有用到QQConstant类,在第四点贴出了代码

public class EnvelopeService extends BaseAccessibilityService { //锁屏、解锁相关 private KeyguardManager.KeyguardLock kl; //唤醒屏幕相关 private PowerManager.WakeLock wl = null; private long delayTime = 0;//延迟抢的时间  @Override public void onAccessibilityEvent(AccessibilityEvent event) {  //验证抢红包的开关  if (!invalidEnable()) {   return;  }  //事件类型  int eventType = event.getEventType();  //获取包名  CharSequence packageName = event.getPackageName();  if (TextUtils.isEmpty(packageName)) {   return;  }  switch (eventType) {   //状态栏变化   case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:    if (QQConstant.QQ_PACKAGE_NAME.equals(packageName)) {     //处理状态栏上QQ的消息,如果是红包就跳转过去     progressQQStatusBar(event);    }    break;   //窗口切换的时候回调   case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:   case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:    if (QQConstant.QQ_PACKAGE_NAME.equals(packageName)) {     //处理正在QQ聊天窗口页面,有其他群或者人有新的红包提醒,跳转过去。     progressNewMessage(event);     //处理聊天页面的红包     progressQQChat(event);    }    break;  } }  private void progressNewMessage(AccessibilityEvent event) {  if (event == null) {   return;  }  AccessibilityNodeInfo source = event.getSource();  if (source == null) {   return;  }  //根据event的source里的text,来判断这个消息是否包含[QQ红包]的字眼,有的话就跳转过去  CharSequence text = source.getText();  if (!TextUtils.isEmpty(text) && text.toString().contains(QQConstant.QQ_ENVELOPE_KEYWord)) {   performViewClick(source);  } }  private boolean invalidEnable() {  return SettinGConfig.getInstance().getReEnable(); }  public void progressQQStatusBar(AccessibilityEvent event) {  List<CharSequence> text = event.getText();  //开始检索界面上是否有QQ红包的文本,并且他是通知栏的信息  if (text != null && text.size() > 0) {   for (CharSequence charSequence : text) {    if (charSequence.toString().contains(QQConstant.QQ_ENVELOPE_KEYWORD)) {     //说明存在红包弹窗,马上进去     if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) {      Notification notification = (Notification) event.getParcelableData();      if (notification == null) {       return;      }      PendingIntent pendingIntent = notification.contentIntent;      if (pendingIntent == null) {       return;      }      try {       //要跳转之前,先进行解锁屏幕,然后再跳转,有可能你现在屏幕是锁屏状态,先进行解锁,然后打开页面,有密码的可能就不行了       wakeUpAndUnlock(MyApp.context);       //跳转       pendingIntent.send();      } catch (PendingIntent.CanceledException e) {       e.printStackTrace();      }     }    }   }  } }  public void progressQQChat(AccessibilityEvent event) {  if (TextUtils.isEmpty(event.getClassName())) {   return;   //如果当前页面是聊天页面或者当前的描述信息是"返回消息界面",就肯定是对话页面  }  //验证当前事件是否符合查询页面上的红包  if (!invalidEnvelopeUi(event)) {   return;  }  //延迟点击红包,防止被检测到开了抢红包,不过感觉还是感觉会被检测到,应该有的效果吧...  try {   Thread.sleep(delayTime);  } catch (InterruptedException e) {   e.printStackTrace();  }  //普通红包,检索点击拆开的字眼。  List<AccessibilityNodeInfo> envelope = findViewListByText(QQConstant.QQ_CLICK_TAKE_APART, false);  //处理普通红包  progressNormal(envelope);  //口令红包,检索口令红包的字眼。  List<AccessibilityNodeInfo> passwordList = findViewListByText(QQConstant.QQ_CLICK_PASSWORD_DIALOG, false);  //处理口令红包  progressPassword(passwordList); }  public boolean invalidEnvelopeUi(AccessibilityEvent event) {  //判断类名是否是聊天页面  if (!QQConstant.QQ_IM_CHAT_ACTIVITY.equals(event.getClassName().toString())) {   return true;  }  //判断页面中的元素是否有点击拆开的文本,有就返回可以进行查询了  int recordCount = event.getRecordCount();  if (recordCount > 0) {   for (int i = 0; i < recordCount; i++) {    AccessibilityRecord record = event.getRecord(i);    if (record == null) {     break;    }    List<CharSequence> text = record.getText();    if (text != null && text.size() > 0 && text.contains(QQConstant.QQ_CLICK_TAKE_APART)) {     //如果文本中有点击拆开的字眼,就返回可以进行查询了     return true;    }   }  }  return false; }  private void back2Home(int time) {  try {   Thread.sleep(time);  } catch (InterruptedException e) {   e.printStackTrace();  }  Intent home = new Intent(Intent.ACTION_MAIN);  home.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  home.addCategory(Intent.CATEGORY_HOME);  startActivity(home); }  public void progressNormal(List<AccessibilityNodeInfo> passwordList) {  if (passwordList != null && passwordList.size() > 0) {   for (AccessibilityNodeInfo accessibilityNodeInfo : passwordList) {    if (accessibilityNodeInfo != null && !TextUtils.isEmpty(accessibilityNodeInfo.getText()) && QQConstant.QQ_CLICK_TAKE_APART.equals(accessibilityNodeInfo.getText().toString())) {     //点击拆开红包     performViewClick(accessibilityNodeInfo);     //回复感谢信息,根据配置文件中配置的回复信息回复     String reReplyMessage = SettingConfig.getInstance().getReReplyMessage();     if (!TextUtils.isEmpty(reReplyMessage)) {      replyMessage(reReplyMessage);     }    }   }   //最后延迟事件触发返回事件,关闭红包页面   performBackClick(1200);  } }  public void progressPassword(List<AccessibilityNodeInfo> passwordList) {  if (passwordList != null && passwordList.size() > 0) {   for (AccessibilityNodeInfo accessibilityNodeInfo : passwordList) {    if (accessibilityNodeInfo != null && !TextUtils.isEmpty(accessibilityNodeInfo.getText()) && QQConstant.QQ_CLICK_PASSWORD_DIALOG.equals(accessibilityNodeInfo.getText().toString())) {     //如果口令红包存在,就在输入框中进行输入,然后发送     AccessibilityNodeInfo parent = accessibilityNodeInfo.getParent();     if (parent != null) {      CharSequence contentDescription = parent.getContentDescription();      if (!TextUtils.isEmpty(contentDescription)) {       //1. 获取口令       String key = (String) contentDescription;       if (key.contains(",") && key.contains("口令:")) {        key = key.substring(key.indexOf("口令:") + 3, key.lastIndexOf(","));       }       Log.e("口令", key);       //2. 填写口令到编辑框上然后进行发送       replyMessage(key);       //返回,关闭红包页面       performBackClick(1200);      }     }    }   }  } }  @SuppressLint("Wakelock") @SuppressWarnings("deprecation") public void wakeUpAndUnlock(Context context) {  // 点亮屏幕  wl.acquire();  // 释放  wl.release();  // 解锁  kl.disableKeyguard(); }  public void replyMessage(String key) {  replyMessage(key, 0); }  public void replyMessage(String key, int time) {  //延迟  if (time > 0) {   try {    Thread.sleep(time);   } catch (InterruptedException e) {    e.printStackTrace();   }  }  //获取QQ聊天页面输入框  AccessibilityNodeInfo chat_edit = findViewByID(QQConstant.QQ_CHAT_MESSAGE_INPUT);  if (chat_edit != null) {   //把口令粘贴到输入框中   pastaText(chat_edit, MyApp.context, key);   //获取QQ聊天页面发送消息按钮   AccessibilityNodeInfo sendMessage = findViewByID(QQConstant.QQ_CHAT_MESSAGE_SEND);   //然后就按下发送按钮   if (sendMessage != null && Button.class.getName().equals(sendMessage.getClassName())) {    performViewClick(sendMessage);   }  } } @Override public void onInterrupt() { } @Override protected void onServiceConnected() {  super.onServiceConnected();  // 获取电源管理器对象  PowerManager pm = (PowerManager) MyApp.context    .getSystemService(Context.POWER_SERVICE);  // 获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是调试用的Tag  wl = pm.newWakeLock(    PowerManager.ACQUIRE_CAUSES_WAKEUP      | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");  KeyguardManager km = (KeyguardManager) MyApp.context.getSystemService(Context.KEYGUARD_SERVICE);  kl = km.newKeyguardLock("unLock");  //初始化屏幕的监听  ScreenListener screenListener = new ScreenListener(MyApp.context);  screenListener.begin(new ScreenListener.ScreenStateListener() {   @Override   public void onScreenOn() {    Log.e("ScreenListener", "屏幕打开了");   }   @Override   public void onScreenOff() {    //在屏幕关闭的时候,进行锁屏,不执行的话,锁屏就失效了,因为要实现锁屏状态下也可以进行抢红包。    Log.e("ScreenListener", "屏幕关闭了");    if (kl != null) {     kl.disableKeyguard();     kl.reenableKeyguard();    }   }   @Override   public void onUserPresent() {    Log.e("ScreenListener", "解锁了");   }  }); } @Override public void onDestroy() {  super.onDestroy(); }}

(四)QQ辅助服务里有用到的常量

public class QQConstant { //QQ的应用包名 public static final String QQ_PACKAGE_NAME = "com.tencent.mobileqq"; //状态栏红包关键字 public static final String QQ_ENVELOPE_KEYWORD = "[QQ红包]"; //QQ聊天页面 public static final String QQ_IM_CHAT_ACTIVITY = "com.tencent.mobileqq.activity.SplashActivity"; //点击拆开 public static final String QQ_CLICK_TAKE_APART = "点击拆开"; //口令红包 public static final String QQ_CLICK_PASSWORD_DIALOG = "口令红包"; //聊天页面,输入框ID public static final String QQ_CHAT_MESSAGE_INPUT = "com.tencent.mobileqq:id/input"; //聊天页面,发送按钮 public static final String QQ_CHAT_MESSAGE_SEND = "com.tencent.mobileqq:id/fun_btn";}

五、红包问题

用的时候偶尔会被QQ检测到用了红包插件,可能是因为抢的速度太快,导致数据不符合正常的点击时间,我有加入一个延迟时间,不知道有没有效果,如果有知道的也可以留言,谢谢。

在QQ的主页面上,收到消息的时候通知栏是不会通知的,所以这里不能进行解析通知栏跳转聊天页面,没有找到什么元素可以告诉我怎么进入红包的聊天页面,如果有知道的可以留言,谢谢。

这种辅助服务的方式抢红包,进入聊天页面后,他检索字段只会检索当前页面可视的元素,某些红包要是在聊天记录上面看不见的,需要滑动上去才可以触发解析红包,不过一般不会一次性10个红包都发出来吧,嘿嘿。

以上是“Android辅助功如何实现自动抢红包”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Android辅助功如何实现自动抢红包

本文链接: https://www.lsjlt.com/news/220224.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android辅助功如何实现自动抢红包
    这篇文章主要介绍Android辅助功如何实现自动抢红包,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、描述最近看到同事有用抢红包的软件,就想看看抢红包的具体实现是如何的,所以了解了一下,有用辅助功能实现的,所以在下...
    99+
    2023-05-30
    android
  • Android辅助功能AccessibilityService与抢红包辅助
    推荐阅读:Android中微信抢红包插件原理解析及开发思路 抢红包的原理都差不多,一般是用Android的辅助功能(AccessibilityService类)先监听通知栏事件...
    99+
    2022-06-06
    抢红包 Android
  • Android实现微信自动抢红包的程序
     简单实现了微信自动抢红包的服务,原理就是根据关键字找到相应的View, 然后自动点击。主要是用到AccessibilityService这个辅助服务,基本可以满足自...
    99+
    2022-06-06
    自动 程序 抢红包 Android
  • Android中微信抢红包助手的实现详解
    实现原理 通过利用AccessibilityService辅助服务,监测屏幕内容,如监听状态栏的信息,屏幕跳转等,以此来实现自动拆红包的功能。关于AccessibilitySe...
    99+
    2022-06-06
    抢红包 Android
  • Android微信自动抢红包插件优化和实现
    又是兴趣系列 网上有很多自动强红包的例子和代码,笔者也是做了一些优化。 先说说自己的两个个优势 1.可以在聊天界面自动强不依赖于通知栏推送 2.可以在屏幕熄灭的时候的时候点亮...
    99+
    2022-06-06
    自动 插件 抢红包 优化 Android
  • 教你一步步实现Android微信自动抢红包
    本文介绍微信自动抢红包的实现方法,主要实现以下几个功能:       1.自动拆开屏幕上出现的红包   ...
    99+
    2022-06-06
    自动 抢红包 Android
  • Python+Appium实现自动抢微信红包
    目录环境准备实现思路code环境准备 appium环境 安卓手机 usb数据线 python环境 实现思路 我们收到红包和消息都是自动置顶到第一个,于是我们打开第一个判断是否有红...
    99+
    2022-06-02
    Python 抢微信红包 Python+Appium 抢红包
  • Android微信抢红包功能的实现原理浅析
    快到过农历年了,微信红包也越来越多了,出现了好多红包外挂程序,就很好奇如何实现的,于是自己研究了一番,亲自写了个微信抢红包的APP。现在就一步一步来实现它。 实现思路 微信抢红...
    99+
    2022-06-06
    抢红包 Android
  • Python+Appium实现自动抢微信红包的方法
    这篇文章将为大家详细讲解有关Python+Appium实现自动抢微信红包的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。环境准备appium环境安卓手机usb数据线python环境实现思路我们收到红包...
    99+
    2023-06-15
  • Javascript如何实现网页抢红包
    这篇文章主要介绍了Javascript如何实现网页抢红包,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一开始用Firefox加Firebug...
    99+
    2022-10-19
  • C#如何实现抢红包算法
    今天小编给大家分享一下C#如何实现抢红包算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。二倍均值法(公平版) 发...
    99+
    2023-06-29
  • asp.net如何开发微信派发现金红包/H5网页抢红包功能
    这篇文章将为大家详细讲解有关asp.net如何开发微信派发现金红包/H5网页抢红包功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、网页版抢红包功能,前端先做好抢红包的页面;后台配置微信公众号的app...
    99+
    2023-06-14
  • 如何在Android应用中实现一个图库辅助器功能
    如何在Android应用中实现一个图库辅助器功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。实现步骤第一步,创建辅助类,使用弱引用持有Activity,防止内存溢出。 ...
    99+
    2023-05-31
    android roi
  • 如何使用Android实现红包雨动画效果
    这篇文章主要介绍如何使用Android实现红包雨动画效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!红包雨关于实现上面红包雨效果步骤如下:创建一个红包实体类public class RedPac...
    99+
    2023-05-30
    android
  • Python如何实现12306自动抢火车票功能
    这篇文章将为大家详细讲解有关Python如何实现12306自动抢火车票功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、效果展示在正式进入代码讲解之前,先来看下本文的实现效果。如果不是为了演示效果,直...
    99+
    2023-06-22
  • Android实现自动匹配关键字并且标红功能
    本文实例为大家分享了Android匹配关键字标红的具体代码,供大家参考,具体内容如下1. 单关键字匹配若只需匹配 搜索内容  可以写的简单一些,代码如下:if (name != null && name.conta...
    99+
    2023-05-31
    android 关键字 标红
  • php代码如何实现红包功能
    这篇文章主要介绍“php代码如何实现红包功能”,在日常操作中,相信很多人在php代码如何实现红包功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php代码如何实现红包功能”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-25
  • Android如何实现抢购倒计时功能
    这篇文章将为大家详细讲解有关Android如何实现抢购倒计时功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、效果图二、思路算多少秒,秒数取余60,(满足分后剩下的秒数)算多少分,秒数除60,再取余6...
    99+
    2023-06-14
  • 二维码如何辅助 ASP 网页实现 load 重定向的功能?
    随着互联网技术的不断发展,越来越多的网站采用ASP.NET技术来开发网页。但是,ASP.NET网页的load重定向功能并不像其他网页那样简单。在这种情况下,二维码就成为了一个非常有用的工具,可以帮助ASP.NET网页实现load重定向功能。...
    99+
    2023-07-03
    二维码 load 重定向
  • CSS3如何实现微信拆红包动画效果
    本篇内容介绍了“CSS3如何实现微信拆红包动画效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!用CSS3绘制红包.redpack ...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作