`

图片异步加载(带进度条)+二级缓存+图片手势缩放+ViewPaper+设置壁纸

阅读更多

功能:实现图片的加载(带进度条)、缓存、手势缩放、ViewPaper展示、设置壁纸等常用功能

 

效果图:



 

 

 

 主要实现:

 

 图片加载框架: Android-Universal-Image-Loader

 

 Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。
 
 File cacheDir = StorageUtils.getOwnCacheDirectory(getApplicationContext(), "imageloader/Cache"); 
        //初始化Android-Universal-Image-Loader图片加载框架
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
        .diskCache(new UnlimitedDiscCache(cacheDir)) //自定义缓存路径  
        .denyCacheImageMultipleSizesInMemory()
        .diskCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5 加密 
        .tasksProcessingOrder(QueueProcessingType.LIFO)
        .writeDebugLogs() // Remove for release app
        .build();
        ImageLoader.getInstance().init(config);
 
private void initDisplayImageOptions() {
        disOptions = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.empty_photo) // 设置图片在下载期间显示的图片
                .showImageForEmptyUri(R.drawable.empty_photo)// 设置图片Uri为空或是错误的时候显示的图片
                .showImageOnFail(R.drawable.empty_photo) // 设置图片加载/解码过程中错误时候显示的图片
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .considerExifParams(true)
                .bitmapConfig(Bitmap.Config.RGB_565)
                // .delayBeforeLoading(1000)//设置的下载前的延迟时间
                // .displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少
                .displayer(new FadeInBitmapDisplayer(100))// 是否图片加载好后渐入的动画时间
                .build();
    }
@Override
        public View getView(int index, View convertView, ViewGroup parent) {
            final GridHolder holder;
            if (convertView == null) {
                LayoutInflater layoutInflator = LayoutInflater.from(parent.getContext());
                convertView = layoutInflator.inflate(R.layout.grid_item, null);
                holder = new GridHolder();
                holder.appImage = (ImageView) convertView.findViewById(R.id.itemImage);
                holder.appName = (TextView) convertView.findViewById(R.id.itemText);
                holder.progressBar = (ProgressBar) convertView.findViewById(R.id.progress);
                convertView.setTag(holder);
            } else {
                holder = (GridHolder) convertView.getTag();
            }
            GridInfo info = list.get(index);
            if (info != null) {
                holder.appName.setText(info.getName());
                // imageLoader.displayImage(info.getPicUrl(),
                // holder.appImage,disOptions);
                imageLoader.displayImage(info.getPicUrl(), holder.appImage, disOptions, new SimpleImageLoadingListener() {
                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        holder.progressBar.setProgress(0);
                        holder.progressBar.setVisibility(View.VISIBLE);
                    }
                    @Override
                    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                        // TODO Auto-generated method stub
                        holder.progressBar.setVisibility(View.GONE);
                    }
                    @Override
                    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                        holder.progressBar.setVisibility(View.GONE);
                    }
                }, new ImageLoadingProgressListener() {
                    @Override
                    public void onProgressUpdate(String imageUri, View view, int current, int total) {
                        holder.progressBar.setProgress(Math.round(100.0f * current / total));
                    }
                });
            }
            return convertView;
        }
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.item_clear_memory_cache:
            imageLoader.clearMemoryCache();//清除内存中的缓存
            return true;
        case R.id.item_clear_disc_cache:
            imageLoader.clearDiskCache();//清除SD卡中的缓存
            return true;
        default:
            return false;
    }
}
String imageUri = "http://site.com/image.png"; // from Web
String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
String imageUri = "content://media/external/audio/albumart/13"; // from content provider
String imageUri = "assets://image.png"; // from assets
String imageUri = "drawable://" + R.drawable.image; // from drawables

图片手势缩放框架:GestureImageView
单图浏览插件,支持图片多点缩放,支持图片拖动,开放单击和双击事件,点击事件与触摸事件不冲突。
GestureImageView使用和配置是非常简单的。入手非常容易。
<com.polites.android.GestureImageView
        android:id="@+id/image"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:scaleType="centerCrop"
        gesture-image:max-scale="10.0"
        gesture-image:min-scale="0.7" 
        gesture-image:strict="false" />

gesture-image:min-scale 缩放最小值
gesture-image:max-scale 缩放最大值
gesture-image:strict  是否精确
/**
     * 保存图片
     */
    private void savePic() {
        showShortToast("保存至手机相册");
        MediaStore.Images.Media.insertImage(getContentResolver(), bitmapPic, "", "");
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + SD_PATH)));
    }
/**
 * 分享图片
 */
private void sharePic() {
    Intent sintent = new Intent(Intent.ACTION_SEND);
    sintent.setType("image/*");
    File shareFile = new File(SD_PATH, "share.jpg");
    try {
        shareFile.createNewFile();
        saveBitmapFile(bitmapPic, shareFile);
    } catch (IOException e) {
        e.printStackTrace();
    }
    saveBitmapFile(bitmapPic, shareFile);
    Uri u = Uri.fromFile(shareFile);
    sintent.putExtra(Intent.EXTRA_STREAM, u);
    startActivity(Intent.createChooser(sintent, "分享图片"));
     
}
/**
    * 设置壁纸
    */
   private void setWallpaper() {
        wallpaperFile = new File(SD_PATH, "wallpaper.jpg");
        try {
            if (!wallpaperFile.exists()) {
                wallpaperFile.createNewFile();
            }
            saveBitmapFile(bitmapPic, wallpaperFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Intent intent = new Intent("com.android.camera.action.CROP");
        int width =  WallpaperManager.getInstance(this).getDesiredMinimumWidth();
        int height =  WallpaperManager.getInstance(this).getDesiredMinimumHeight();
        intent.setDataAndType(Uri.parse("file://" + wallpaperFile.getPath()), "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("outputX", width);
        intent.putExtra("outputY", height);
        intent.putExtra("aspectX", width);
        intent.putExtra("aspectY", height);
        intent.putExtra("scale", true);
        intent.putExtra("scaleUpIfNeeded", true);
        intent.putExtra("noFaceDetection", true);
        intent.putExtra("output", Uri.parse("file://" + wallpaperFile.getPath()));
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.name());
        startActivityForResult(intent, SET_WALLPAPER);
         
    }
   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       if (requestCode == SET_WALLPAPER &&resultCode!=0&& data != null) {
            WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
            try {
                wallpaperManager
                        .setBitmap(BitmapFactory.decodeFile(wallpaperFile.getAbsolutePath()));
                showShortToast("设置壁纸成功");
            } catch (IOException e) {
                showShortToast("设置壁纸失败");
                e.printStackTrace();
            }
        }
    }
 
  • 大小: 355.7 KB
  • 大小: 213.1 KB
分享到:
评论

相关推荐

    viewpaper+fragment+radiobutton

    2. **`ViewPaper`的性能优化**:对于大量的文本或图像加载,需要考虑缓存策略、异步加载和内存管理,以避免影响用户体验。 3. **`RadioButton`的交互设计**:确保用户能直观地理解每个按钮的作用,并提供反馈以确认...

    通过缓存下载图片

    综上所述,通过结合内存、文件和网络的三级缓存策略,以及合理使用异步加载、图片压缩等技术,我们可以有效地实现在ViewPaper和RecyclerView中高效加载和展示网络图片。这不仅可以提升应用的性能,还能显著改善用户...

    Viewpaper+Fragment+EventBus+slidingMenu

    在Android应用开发中,"Viewpaper+Fragment+EventBus+slidingMenu" 是一个常见的组合,用于构建功能丰富的用户界面。下面将详细解释这四个关键组件及其在Android开发中的作用。 1. **ViewPager**: ViewPager是...

    tablayout+viewpaper+Recyclerview demon实例

    6. 数据加载:在`Adapter`中设置数据加载逻辑,可能是从网络、数据库或者其他数据源获取数据。 这个实例提供了学习和实践的机会,通过它你可以深入理解Android中这三个关键组件的交互和用法。对于任何Android开发者...

    Viewpaper+listview+fragment

    `ViewPager`的优势在于它可以高效地管理内存,只加载当前显示页面和相邻的页面,这对于展示大量内容或图片的场景非常有利。此外,`ViewPager`还可以配合`TabLayout`实现标签导航。 **2. ListView** `ListView`是一...

    带指示点Viewpaper图片轮播

    5. **自定义适配器**:如果你的图片数据来自网络或本地资源,需要创建一个自定义的适配器来加载和缓存图片,比如使用Glide、Picasso等图片加载库。 6. **生命周期管理**:由于Android应用的生命周期特性,需要考虑...

    viewpaper+gridview实现支付宝的效果

    在Android开发中,"viewpaper+gridview实现支付宝的效果"是一个常见的需求,涉及到视图滚动、网格布局以及界面设计的高级应用。以下是对这个主题的详细解析: 首先,`ViewPaper`是一个Android自定义控件,它实现了...

    Fragment+ViewPaper实现不依赖库的菜单+页面滑动

    `ViewPaper`则是一个轻量级的视图切换库,它可以轻松实现滑动手势来切换多个视图。它的工作原理是通过监听滑动手势,然后改变当前显示的视图。在这里,我们将用它来处理左右滑动的交互,让菜单和内容页面平滑过渡。 ...

    ViewPaper滑动分页

    综上所述,ViewPaper滑动分页是一个涵盖了Android UI设计、手势检测、数据加载、动画效果等多个方面的复杂功能。通过理解这些知识点并结合提供的`ViewPaperDemo`,开发者可以学习如何创建一个具有类似新浪信息流滑动...

    Android事件通知+策划列表菜单+viewpaper

    在Android开发中,事件通知、策划列表菜单以及Viewpaper是三个关键的概念,它们共同构建了丰富的用户交互体验。下面将详细讲解这三个知识点。 首先,**事件通知**在Android应用中扮演着至关重要的角色。它是应用与...

    android 跑马灯图片展示+10种切换特效

    `ViewPaper`库内置了10多种动画效果,包括滑动(slide)、淡入淡出(fade)、缩放(zoom)等。在XML布局文件中,可以通过`app:view_paper_animation_type`属性选择动画类型,例如: - `slide`:图片之间平滑滑动...

    Android_多图双击/多点缩放的本地图片浏览器

    修改了github上的 photoview && image-loader 做成的本地图片浏览器 使之可以在4.1版本以下运行 使之滑到下一页复原上一张图片 使之单击退出浏览操作 使之不出现oom问题 欠缺:自定义viewpaper页卡

    android显示多item多图片的viewpager,选中项居中变大,非选中项模糊变小

    为了加载图片,我们可以使用Glide或者Picasso这样的库,它们提供了便捷的方式来加载和处理图片,包括设置图片大小、格式转换等。 在图片加载过程中,我们可以设置一个占位符和错误图片,以优化用户体验。当图片正在...

    Viewpaper露一半

    它允许用户通过手势左右滑动来切换不同的页面,也可以通过设置PageTransformer来自定义页面滑动的效果。 **Viewpager的工作原理** ViewPager内部维护了一个PagerAdapter,它是一个抽象适配器,需要开发者继承并实现...

    viewPaper的简单介绍

    `viewPaper` 是一个专为前端开发者设计的轻量级视图框架,主要用于构建用户界面。这个框架旨在简化网页布局和交互设计,提供了一套简洁易用的API,使得开发者能够快速地创建出美观且响应式的页面。在本教程中,我们...

    Viewpaper中嵌套Viewpaper的一个框架

    "Viewpaper中嵌套Viewpaper的一个框架"这个主题涉及到的是如何在同一个应用程序中使用Viewpaper这一特定的视图处理库来实现视图的嵌套,并且特别提到了侧边栏的代码设计。Viewpaper可能是一个定制化的视图管理库,...

    android Viewpager+fragment实现页面切换

    6. **可选:添加PageTransformer**:如果希望实现更酷的滑动效果,如深度效果、缩放等,可以设置`ViewPager`的`setPageTransformer`方法,传入一个自定义的`PageTransformer`实现。 7. **可选:添加Indicator**:...

    viewpaper的禁止滑动封装

    android的viewpaper的滑动,封装viewpaper禁止滑动,导航页需要的

    android使用ViewPager实现底部菜单栏和左右滑动效果,加载多个Activity

    - **设置BottomNavigationView**:同样在主Activity中初始化BottomNavigationView,设置菜单项,然后监听其选择事件。当用户点击菜单项时,更新ViewPager当前显示的页面。 - **连接ViewPager和BottomNavigation...

Global site tag (gtag.js) - Google Analytics