很多App都有扫描二维码功能,扫描的时候会有一个移动的扫描线,看起来很好实现,不过我网上搜了搜很多方法都是实时绘制出来的,计算点的位置然后重绘出来。我的第一感觉是完全没必要,其实这个东西本质上就是一张贴图加一个平移动画效果,所以就自己做了一个小小例子。
首先是扫描线的素材,这个是直接从微信apk里面扒出来的(其实你如果看中某个App的界面中的某个素材,可以直接下载apk,后缀改成zip解压,然后在里面慢慢找,一般都能找到png图片)。
然后贴出布局文件代码:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="com.example.user.myapplication.MainActivity">
- <View
- android:id="@+id/previewView"
- android:layout_width="300dp"
- android:layout_height="300dp"
- android:layout_centerInParent="true"
- android:background="@color/colorPrimary"/>
- <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>
<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主要是用来模拟拍照的预览图,这个预览图提供了动画定位信息,接下来代码会讲。下面是核心代码:- public class MainActivity extends AppCompatActivity {
- private ImageView mScanHorizontalLineImageView;
- private ImageView mScanVerticalLineImageView;
- private View mPreviewView;
- @Override
- protected 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);
- }
- @Override
- public 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();
- }
- }
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
- 2017-04-01 18:06 1楼
最终效果图介绍首先我们看一下这个效果,它由以...
-
扫描动画效果,效果如图所示
-
通过效果图,可以看到最边缘的一个圆环,顺时针转动,内部出现辐射光圈。 先看代码,创建一个Activity. pu...
效果图:
源码: package com.zihao.radar;
import android.app.Activity; import android.os.Bundle;...
一个具有圆形背景的等宽等高的视图上,上下来回滚动一个渐变的矩形,矩形的两边不能超出圆,也不能比圆小......
App欢迎界面的动画跳转 输入框EditText没有输入的水平晃动动画 仿360雷达扫描旋转动画 App欢迎界面的透...
package com.seehow.elabpupil.exp;
import com.seehow.elabpupil.R; import com.seehow.elabpupil.v...
界面上的黄色圆点动画效果看着不是很明显 看着没什么太大的效果 经常使用微信扫一扫功能的人都感觉,微信的动画效果看着很不错 看一下ZXing的Viewfind...
例子, 都是我从网上找的, 只不过是自已简化了一些, 改掉了一...
- robertkun
- 2015年01月15日 13:45
- 2558
的有的是zxing,后来发现...
考虑这个自定义view需要什么属性来方便在xml布局里面改。 在values/attrs.xml里面添加自定义属性...
复制代码