Android使⽤动画实现扫描线效果
张翰新恋情很多App都有扫描⼆维码功能,扫描的时候会有⼀个移动的扫描线,看起来很好实现,不过我⽹上搜了搜很多⽅法都是实时绘制出来的,计算点的位置然后重绘出来。我的第⼀感觉是完全没必要,其实这个东西本质上就是⼀张贴图加⼀个平移动画效果,所以就⾃⼰做了⼀个⼩⼩例⼦。
⾸先是扫描线的素材,这个是直接从apk⾥⾯扒出来的(其实你如果看中某个App的界⾯中的某个素材,可以直接下载apk,后缀改成zip解压,然后在⾥⾯慢慢,⼀般都能到png图⽚)。
然后贴出布局⽂件代码:
<?xml version="1.0" encoding="utf-8"?>
馥怎么读<RelativeLayout xmlns:android="schemas.android/apk/res/android"
xmlns:tools="schemas.android/tools"
android:id="@+id/activity_main"
上海保障房
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="application.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>
界⾯很简单,previewView主要是⽤来模拟拍照的预览图,这个预览图提供了动画定位信息,接下来代码会讲。下⾯是核⼼代码:
高考成绩多久出来public class MainActivity extends AppCompatActivity {
private ImageView mScanHorizontalLineImageView;
private ImageView mScanVerticalLineImageView;
private View mPreviewView;
@Override
protected void onCreate(Bundle 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) {
int[] location = new int[2];
// getLocationInWindow⽅法要在onWindowFocusChanged⽅法⾥⾯调⽤
// 个⼈理解是onCreate时,View尚未被绘制,因此⽆法获得具体的坐标点
// 模拟的mPreviewView的左右上下坐标坐标
int left = Left();
int right = Right();
int top = Top();
int bottom = Bottom();
/
/ 从上到下的平移动画
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();
}
}
最后的效果⼤概就是这个样⼦的:
其实扫描识别⼆维码这个东西,个⼈理解就是照相机得到的帧不停地塞给图像处理模块,然后等待图像处理模块回调。