SubsamplingScaleImageView加载大长图

1、SubsamplingScaleImageView是一个非常优秀长图加载控件,使用起来也非常简单,主要适用于当原图的长度和宽度都超过手机屏幕的长度和宽度,当用普通的ImageView控件的时候,图片会严重的变形的,而SubsamplingScaleImageView非常完美的解决了这一特性。

2、在安卓studio中使用

2.1在build.gradle中引入,我使用的是Glide下载的

compile 'com.github.bumptech.glide:glide:3.7.0' compile ‘

com.davemorrissey.labs:subsampling-scale-image-view:3.5.0'

2.2引入布局xml

<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView android:id="@+id/imageView" android:layout_width="match_parent" app:quickScaleEnabled="true" android:layout_height="match_parent"/>

2.3代码展示

public class MainActivity extends AppCompatActivity {

    private GestureDetector gestureDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String imagePath="";
        final SubsamplingScaleImageView imageView =  (SubsamplingScaleImageView)findViewById(R.id.imageView);
        //手势回调
        gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                if (imageView.isReady()) {
                    PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
                    Toast.makeText(getApplicationContext(), "单击: " + ((int) sCoord.x) + ", " + ((int) sCoord.y),
                            Toast.LENGTH_SHORT).show();
                } else {
                    // Toast.makeText(getApplicationContext(), fail_tips, Toast.LENGTH_SHORT).show();
                }

                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                if (imageView.isReady()) {
                    PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
                    Toast.makeText(getApplicationContext(), "长按: " + ((int) sCoord.x) + ", " + ((int) sCoord.y),
                            Toast.LENGTH_SHORT).show();
                } else {
                    //Toast.makeText(getApplicationContext(), fail_tips, Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public boolean onDoubleTap(MotionEvent e) {
                if (imageView.isReady()) {
                    PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
                    Toast.makeText(getApplicationContext(), "双击: " + ((int) sCoord.x) + ", " + ((int) sCoord.y),
                            Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "", Toast.LENGTH_SHORT).show();
                }

                return false;
            }
        });

        imageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                return gestureDetector.onTouchEvent(motionEvent);
            }
        });

        imageView.setMaxScale(15);
        imageView.setZoomEnabled(true);
        // spinner.setVisibility(View.GONE);
        imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM);
        Glide.with(this)
                .load(imagePath).downloadOnly(new SimpleTarget<File>() {
            @Override
            public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) {
                int  sWidth = BitmapFactory.decodeFile(resource.getAbsolutePath()).getWidth();
                int sHeight = BitmapFactory.decodeFile(resource.getAbsolutePath()).getHeight();
                WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
                int width = wm.getDefaultDisplay().getWidth();
                int height = wm.getDefaultDisplay().getHeight();
                if (sHeight >= height
                        && sHeight / sWidth >=3) {
                    imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP);
                    imageView.setImage(ImageSource.uri(Uri.fromFile(resource)), new ImageViewState(2.0F, new PointF(0, 0), 0));
                }else {
                    imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM);
                    imageView.setImage(ImageSource.uri(Uri.fromFile(resource)));
                    imageView.setDoubleTapZoomStyle(ZOOM_FOCUS_CENTER_IMMEDIATE);
                }


            }

            @Override
            public void onStart() {
                super.onStart();
            }

            @Override
            public void onLoadFailed(Exception e, Drawable errorDrawable) {
                super.onLoadFailed(e, errorDrawable);
            }
        });
    }
}

3、注意事项

     使用Glide下载大长图时,如果在项目中同时使用了使用Glide进行图片格式的转换时就会出现下载图片失败的问题。比如使用了GlideModule改变图片的加载格式。详情读者可以自行去研究源码的实现原理

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值