博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扫描线
阅读量:7087 次
发布时间:2019-06-28

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

很多App都有扫描二维码功能,扫描的时候会有一个移动的扫描线,看起来很好实现,不过我网上搜了搜很多方法都是实时绘制出来的,计算点的位置然后重绘出来。我的第一感觉是完全没必要,其实这个东西本质上就是一张贴图加一个平移动画效果,所以就自己做了一个小小例子。

首先是扫描线的素材,这个是直接从微信apk里面扒出来的(其实你如果看中某个App的界面中的某个素材,可以直接下载apk,后缀改成zip解压,然后在里面慢慢找,一般都能找到png图片)。

然后贴出布局文件代码:

[java]
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:id="@+id/activity_main"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     tools:context="com.example.user.myapplication.MainActivity">  
  8.     <View  
  9.         android:id="@+id/previewView"  
  10.         android:layout_width="300dp"  
  11.         android:layout_height="300dp"  
  12.         android:layout_centerInParent="true"  
  13.         android:background="@color/colorPrimary"/>  
  14.   
  15.     <ImageView  
  16.         android:id="@+id/scanHorizontalLineImageView"  
  17.         android:layout_width="300dp"  
  18.         android:layout_height="wrap_content"  
  19.         android:src="@drawable/horizontal_line" />  
  20.   
  21.     <ImageView  
  22.         android:id="@+id/scanVerticalLineImageView"  
  23.         android:layout_width="wrap_content"  
  24.         android:layout_height="300dp"  
  25.         android:src="@drawable/vertical_line"/>  
  26. </RelativeLayout>  
<ImageView    android:id="@+id/scanHorizontalLineImageView"    android:layout_width="300dp"    android:layout_height="wrap_content"    android:src="@drawable/horizontal_line" /><ImageView    android:id="@+id/scanVerticalLineImageView"    android:layout_width="wrap_content"    android:layout_height="300dp"    android:src="@drawable/vertical_line"/>复制代码

</RelativeLayout>

界面很简单,previewView主要是用来模拟拍照的预览图,这个预览图提供了动画定位信息,接下来代码会讲。下面是核心代码:

 
 
[java]
  1. public class MainActivity extends AppCompatActivity {  
  2.   
  3.     private ImageView mScanHorizontalLineImageView;  
  4.     private ImageView mScanVerticalLineImageView;  
  5.     private View mPreviewView;  
  6.   
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.activity_main);  
  11.   
  12.         mScanHorizontalLineImageView = (ImageView) findViewById(R.id.scanHorizontalLineImageView);  
  13.         mScanVerticalLineImageView = (ImageView) findViewById(R.id.scanVerticalLineImageView);  
  14.         mPreviewView = findViewById(R.id.previewView);  
  15.     }  
  16.   
  17.     @Override  
  18.     public void onWindowFocusChanged(boolean hasFocus) {  
  19.         super.onWindowFocusChanged(hasFocus);  
  20.   
  21.         int[] location = new int[2];  
  22.   
  23.         // getLocationInWindow方法要在onWindowFocusChanged方法里面调用  
  24.         // 个人理解是onCreate时,View尚未被绘制,因此无法获得具体的坐标点  
  25.         mPreviewView.getLocationInWindow(location);  
  26.   
  27.         // 模拟的mPreviewView的左右上下坐标坐标  
  28.         int left = mPreviewView.getLeft();  
  29.         int right = mPreviewView.getRight();  
  30.         int top = mPreviewView.getTop();  
  31.         int bottom = mPreviewView.getBottom();  
  32.   
  33.         // 从上到下的平移动画  
  34.         Animation verticalAnimation = new TranslateAnimation(left, left, top, bottom);  
  35.         verticalAnimation.setDuration(3000); // 动画持续时间  
  36.         verticalAnimation.setRepeatCount(Animation.INFINITE); // 无限循环  
  37.   
  38.         // 播放动画  
  39.         mScanHorizontalLineImageView.setAnimation(verticalAnimation);  
  40.         verticalAnimation.startNow();  
  41.   
  42.         // 从左到右的平移动画  
  43.         Animation horizontalAnimation = new TranslateAnimation(left, right, top, top);  
  44.         horizontalAnimation.setDuration(3000); // 动画持续时间  
  45.         horizontalAnimation.setRepeatCount(Animation.INFINITE); // 无限循环  
  46.   
  47.         //播放动画  
  48.         mScanVerticalLineImageView.setAnimation(horizontalAnimation);  
  49.         horizontalAnimation.startNow();  
  50.   
  51.     }  
  52. }  
public class MainActivity extends AppCompatActivity {
private ImageView mScanHorizontalLineImageView;private ImageView mScanVerticalLineImageView;private View mPreviewView;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    mScanHorizontalLineImageView = (ImageView) findViewById(R.id.scanHorizontalLineImageView);    mScanVerticalLineImageView = (ImageView) findViewById(R.id.scanVerticalLineImageView);    mPreviewView = findViewById(R.id.previewView);}@Overridepublic void onWindowFocusChanged(boolean hasFocus) {    super.onWindowFocusChanged(hasFocus);    int[] location = new int[2];    // getLocationInWindow方法要在onWindowFocusChanged方法里面调用    // 个人理解是onCreate时,View尚未被绘制,因此无法获得具体的坐标点    mPreviewView.getLocationInWindow(location);    // 模拟的mPreviewView的左右上下坐标坐标    int left = mPreviewView.getLeft();    int right = mPreviewView.getRight();    int top = mPreviewView.getTop();    int bottom = mPreviewView.getBottom();    // 从上到下的平移动画    Animation verticalAnimation = new TranslateAnimation(left, left, top, bottom);    verticalAnimation.setDuration(3000); // 动画持续时间    verticalAnimation.setRepeatCount(Animation.INFINITE); // 无限循环    // 播放动画    mScanHorizontalLineImageView.setAnimation(verticalAnimation);    verticalAnimation.startNow();    // 从左到右的平移动画    Animation horizontalAnimation = new TranslateAnimation(left, right, top, top);    horizontalAnimation.setDuration(3000); // 动画持续时间    horizontalAnimation.setRepeatCount(Animation.INFINITE); // 无限循环    //播放动画    mScanVerticalLineImageView.setAnimation(horizontalAnimation);    horizontalAnimation.startNow();}复制代码

}

最后的效果大概就是这个样子的:

其实扫描识别二维码这个东西,个人理解就是照相机得到的帧不停地塞给图像处理模块,然后等待图像处理模块回调。

  • 本文已收录于以下专栏:
  • 2017-04-01 18:06 1楼
  • https://github.com/youxin11544/Zxing-Scan-Anim

最终效果图介绍首先我们看一下这个效果,它由以...

                                                                                                                  

Android自定义View实现雷达扫描动画

  • oxygen0106
  • oxygen0106
  • 2014年10月16日 10:58
  • 3672
在最近的项目中有用到雷达动画,于是

Android模仿微信、云播雷达扫描动画效果源码

  • 2015年09月18日 14:23
  • 2.26MB
  • 下载

android 智能扫描动画

  • 2017年08月24日 16:47
  • 2.26MB
  • 下载

androidの高仿支付宝扫描动画效果

  • 2015年02月03日 17:31
  • 2.05MB
  • 下载

androidの高仿支付宝扫描动画效果

  • xiabing082
  • xiabing082
  • 2015年02月03日 15:23
  • 1964
androidの高仿支付宝扫描动画效果复制代码
  1. 扫描动画效果,效果如图所示  

  2. 通过效果图,可以看到最边缘的一个圆环,顺时针转动,内部出现辐射光圈。   先看代码,创建一个Activity. pu...

                                                                                                             

    android全盘扫面指定后缀名文件并动态显示到列表上demo

    • 2017年09月30日 14:36
    • 20.02MB
    • 下载

    Android--雷达扫描动态界面

    • chaoyu168
    • chaoyu168
    • 2016年07月26日 16:13
    • 1291
    DEMO下载地址:复制代码

效果图:

源码: package com.zihao.radar;

import android.app.Activity; import android.os.Bundle;...

                                                                                                                  

Android自定义View(五)——带扫描线的View

  • ykb19891230
  • ykb19891230
  • 2015年11月12日 17:09
  • 1749
因为技术原理比较简单,所以就不详细赘述实现的细节了。效果需求 复制代码

一个具有圆形背景的等宽等高的视图上,上下来回滚动一个渐变的矩形,矩形的两边不能超出圆,也不能比圆小......

                                                                                                                  

实现android端的类似二维码的扫描窗口(中间亮,四周暗,扫描线循环)

实现android端的类似二维码的扫描窗口(中间亮,四周暗,扫描线循环),主要用到Paint类,drawRect()以及drawLine()函数。...
  • chenmohousuiyue
  • chenmohousuiyue
  • 2016年09月29日 19:51
  • 893

Android动画学习(三)之补间动画常用的实例

  • TDCQZD
  • TDCQZD
  • 2017年07月21日 12:04
  • 219
Android动画学习(三)之补间动画常用的实例本篇主要介绍补间动画几个使用的功能复制代码

App欢迎界面的动画跳转 输入框EditText没有输入的水平晃动动画 仿360雷达扫描旋转动画 App欢迎界面的透...

                                                            

Android Zxing 扫描器 扫描框、扫描线定制样式

  • hupei
  • hupei
  • 2016年07月08日 10:59
  • 8284
一、概述相信Adnroid开发都知道,世界上有四款扫描器,Zxing 、Zbar ,Barcode4J、OkapiBarcode 前二者应用较广泛,至于介绍与区别就在此阐述,网上有很多。此文主要介绍在...

OpenGL实现多边形扫描转换的扫描线算法-带动画效果

  • 2013年04月25日 11:38
  • 459KB
  • 下载

安卓雷达扫描动画效果实现

  • zhao_liwei
  • zhao_liwei
  • 2016年03月09日 10:29
  • 2278
主程序:复制代码

package com.seehow.elabpupil.exp;

import com.seehow.elabpupil.R; import com.seehow.elabpupil.v...

                                                            

二维码扫描之动画效果

  • u011290399
  • u011290399
  • 2013年08月12日 11:31
  • 3429
使用ZXing做出的二维码扫描界面复制代码

界面上的黄色圆点动画效果看着不是很明显 看着没什么太大的效果 经常使用微信扫一扫功能的人都感觉,微信的动画效果看着很不错 看一下ZXing的Viewfind...

                                                            

微信二维码扫描时的动画效果 线

  • chenyong05314
  • chenyong05314
  • 2013年09月16日 16:04
  • 5160
UIView *line = [[UIView alloc] initWithFrame:CGRectMake((viewWidth - width)/2, origin_y, width, 1)];...

Android学习2: Android使用SurfaceView绘制一条移动的线段

今天 学习了一下, 怎样使用 SurfaceView. SurfaceHolder, Canvas 和 Paint 来绘制一条移动的线段复制代码

例子, 都是我从网上找的, 只不过是自已简化了一些, 改掉了一...

  • robertkun
  • robertkun
  • 2015年01月15日 13:45
  • 2558

Zxing界面优化(竖屏、拉伸处理、扫描框大小和扫描线移动)

  • luckrr
  • luckrr
  • 2016年10月09日 16:51
  • 2935
项目上有扫描二维码的需求,目前比较成熟的框架有zbar,zxing。但各有优势,个人觉得还是zbar对扫描的封装效率比较高些,当时我做的是扫描有的zbar,识别本地图库复制代码

的有的是zxing,后来发现...

                                                            

实现android端的类似二维码的扫描窗口(中间亮,四周暗,扫描线循环)

  • 2016年09月29日 19:42
  • 3KB
  • 下载

Android实现带动画效果的自定义View

  • qy1993qy
  • qy1993qy
  • 2016年10月15日 19:55
  • 215
准备工作:复制代码

考虑这个自定义view需要什么属性来方便在xml布局里面改。 在values/attrs.xml里面添加自定义属性...

                                        复制代码
你可能感兴趣的文章
Tomcat设置为系统服务,并随系统自动启动服务
查看>>
leetcode-438-Find All Anagrams in a String
查看>>
iOS逆向之旅(进阶篇) — HOOK(Method Swizzling)
查看>>
video视频播放的关于blob小问题
查看>>
2019web前端全新面试题及答案
查看>>
静态化
查看>>
小猿圈之Linux下Mysql 操作命令
查看>>
程序员:这都什么时代了,还要求手写代码
查看>>
论文笔记【三】A Deep Dive into Word Sense Disambiguation with LSTM
查看>>
测试七 赛后感受
查看>>
day09 函数
查看>>
Hadoop体系架构简介
查看>>
【中文】Joomla1.7扩展介绍之Projectfork(项目管理)
查看>>
HTML基础第十一讲---背景标志
查看>>
打包遇到的问题
查看>>
使用RobotFramework的DataBaseLibrary(Java实现)
查看>>
201771010101 白玛次仁
查看>>
【Android 7.1.1】 锁屏界面点击“空白处”响应事件
查看>>
bzoj 3864: Hero meet devil(dp套dp)
查看>>
JavaScript 实现jquery方法连续调用效果
查看>>