【Android】一个浏览图片的Android库的实现,可以移动、缩放图片以及滑动切换

~转载请注明:http://blog.csdn.net/u013015161/article/details/46640273

介绍

最近写了一个Library, 用于实现在Android设备上对大图的浏览。已经实现的功能有:
1、移动、缩放图片
2、双击快速放大或缩小图片
3、单击退出浏览
4、左右滑动切换图片。
目前还只实现了展示SD卡里图片的功能,后续应该补完,使其可以展示网络图片等。
代码已经在Github上开源, 地址为:
https://github.com/lankton/lanimagebrowser

展示:
图片切换
切换

图片缩放
缩放

实现

实现的思路很简单。图片的缩放、移动等操作通过自定义ImageView实现,这些自定义ImageView通过Fragment来展现。同时,这些Fragment被绑定到ViewPager上,从而实现对图片的切换。下面简单讲一下几个比较关键的地方。
1. 自定义ImageView
主要重写了OnTouchEvent,来监听各种手势事件。同时重写了OnMeasure和OnLayout,来初始化图片在ImageView的显示。直接上代码吧。

package com.lankton.imagebrowser;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;

public class BrowserImageView extends ImageView {

    Context context;

    float originDistance;
    float curDistance;
    float scale; //在上次基础上缩放
    float curScale = 1;
    float beginZoomScale; //开始缩放时的scale

    Matrix matrix = new Matrix();
    Matrix savedMatrix = new Matrix();
    PointF curPoint = new PointF();
    PointF lastPoint = new PointF();
    public BitmapSize bitmapSize;

    private Timer closeTimer;
    private boolean isClose;
    private final float BOUNDS = 30;
    private float originX;
    private float originY;

    float smallScale;
    float bigScale;
    boolean isToBig = true;

    public BrowserImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
//        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sb);  
        // TODO Auto-generated constructor stub
    }

    public BrowserImageView(Context c)
    {
        super(c);
        this.context = c;
    }

    public void setBitmapSize(BitmapSize b)
    {
        this.bitmapSize = b;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        switch(event.getAction() & MotionEvent.ACTION_MASK)
        {
        case MotionEvent.ACTION_DOWN:
            curPoint.x = event.getX();
            curPoint.y = event.getY();
            savedMatrix.set(matrix);  
            isClose = true;
            originX = curPoint.x;
            originY = curPoint.y;
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            isClose = false;
            originDistance = getDistance(event.getX(0), event.getY(0),
                    event.getX(1), event.getY(1));
            beginZoomScale = curScale;
            break;
        case MotionEvent.ACTION_MOVE:
            if(isOutBounds(originX, originY, event.getX(0), event.getY(0)))
            {
                isClose = false;

            }

            if(event.getPointerCount() == 2)
            {
                curDistance = getDistance(event.getX(0), event.getY(0),
                        event.getX(1), event.getY(1));
                scale = curDistance / originDistance;
                curScale = beginZoomScale * scale;
                matrix.set(savedMatrix); 
                matrix.postScale(scale,  scale
                        , (event.getX(0) + event.getX(1))/2
                        , (event.getY(0) + event.getY(1))/2);
                this.setImageMatrix(matrix);
            }
            else if(event.getPointerCount() == 1)
            {
                lastPoint.x = curPoint.x;
            
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值