在 Android 的App程序里,可以通过 ImageView 来查看图片,可以通过 ImageSwitcher 来浏览多张图片
我们今天就借助 ImageView 和 ImageSwitcher 来制作一个简单的照片浏览器
我们需要申请存储权限
打开 app -> manifests -> AndroidManifest.xml 文件
在 manifest 节点下面增加
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
新版本的 Android Studio 在进行 IO 操作时候需要动态申请权限
导入库
import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat;
申请权限
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}我们只需要一个 ImageSwitcher 控件
打开 app -> res -> layout -> activity_main.xml 文件
增加 ImageSwitcher 控件
<ImageSwitcher android:id="@+id/imageswitcher" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000000"/>
这里面用到了几个技术
File:文件夹遍历技术
ImageSwitcher:图片调度器的使用
ImageView:图片显示器的使用
ScaleAnimation:缩放动画的使用
Timer:定时器的使用
我们将一些关键对象放到了属性里,便于调用
private ImageSwitcher imgSwitcher; private ScaleAnimation animation; private String[] images; private Integer currPos; private Float downX;
我们建立 images 字符串数组,通过遍历文件夹将 jpg 图片的路径保存进来
private void LoadPictures(){
String fileName;
File dir;
Integer i, l, fl;
dir = new File("/mnt/sdcard/DCIM/Camera/");
File[] subFile = dir.listFiles();
l = subFile.length;
if(l > 0){
fl = 0;
for(i=0;i<l;i++){
if(subFile[i].isFile()){
fileName = subFile[i].getAbsolutePath();
if(fileName.toLowerCase().indexOf(".jpg") != -1){
fl ++;
}
}
}
images = new String[fl];
fl = 0;
for(i=0;i<l;i++){
if(subFile[i].isFile()){
fileName = subFile[i].getAbsolutePath();
if(fileName.toLowerCase().indexOf(".jpg") != -1){
images[fl] = fileName;
fl ++;
}
}
}
}
}现在我们需要对 ImageSwitcher 进行初始化,设置事件,绑定事件等操作了
初始化
imgSwitcher = (ImageSwitcher) findViewById(R.id.imageswitcher);
设置切换效果
imgSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); imgSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
设置工厂对象
imgSwitcher.setFactory(new ViewFactory(){
@Override
public View makeView(){
ImageView imgView = new ImageView(MainActivity.this);
imgView.setLayoutParams(new ImageSwitcher.LayoutParams(-1, LayoutParams.MATCH_PARENT));
return imgView;
}
});设置触摸事件,左右滑动
imgSwitcher.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
try{
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = event.getX();
break;
case MotionEvent.ACTION_UP:
float lastX = event.getX();
if(lastX > downX) {
PlayPrevious();
}
if(lastX < downX){
PlayNext();
}
break;
}
}
catch (Exception e){
Toast.makeText(getApplication(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
return true;
}
});上一张、下一张函数
private void PlayPrevious(){
if (currPos == 0) {
currPos = images.length;
}
imgSwitcher.setInAnimation(AnimationUtils.loadAnimation(getApplication(), android.R.anim.fade_in));
imgSwitcher.setOutAnimation(AnimationUtils.loadAnimation(getApplication(), android.R.anim.fade_out));
currPos--;
imgSwitcher.clearAnimation();
imgSwitcher.setImageURI(Uri.fromFile(new File(images[currPos])));
imgSwitcher.startAnimation(animation);
}
private void PlayNext(){
if(currPos == images.length - 1) {
currPos = -1;
}
imgSwitcher.setInAnimation(AnimationUtils.loadAnimation(getApplication(), android.R.anim.fade_in));
imgSwitcher.setOutAnimation(AnimationUtils.loadAnimation(getApplication(), android.R.anim.fade_out));
currPos ++ ;
imgSwitcher.clearAnimation();
imgSwitcher.setImageURI(Uri.fromFile(new File(images[currPos])));
imgSwitcher.startAnimation(animation);
}现在我们给图片增加缩放动画效果
animation = new ScaleAnimation( 1, 1.5f, 1, 1.5f, Animation.RELATIVE_TO_SELF, 0.5f, 1, 0.5f ); animation.setDuration(6000); animation.setRepeatCount(0);
我们通过 Timer 定时器让 ImageSwitcher 自动轮播照片
final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
PlayNext();
}
});
}
};
timer.schedule(timerTask, 0, 6000);简单的照片浏览器制作完成了,赶快安装到手机上用用看吧~~