如果说我比别人看得更远些,那是因为我站在了巨人的肩上。

github地址:https://github.com/chrisbanes/PhotoView

介绍

在一般的应用中,总会遇到查看图片的功能,点击图片之后,详细查看,PhotoView这个开源控件就帮我们很好的完成了这个功能。

它继承自ImageView,支持缩放,以及各种手势的监听。

特性

  • 通过多点触摸和双击来进行放大。
  • 通过轻弹划实现平滑滚动。
  • 在带有滚动功能的父类工作的很好(比如ViewPager)
  • 允许当显示的矩阵发生发生改变时通知应用,当你需要基于当前缩放/滑动位置来更新你的ui时非常有用。
  • 允许当你点击图片时通知应用

使用

1、通过代码附加ImageView使用

ImageView mImageView;
PhotoViewAttacher mAttacher; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // Any implementation of ImageView can be used!
mImageView = (ImageView) findViewById(R.id.iv_photo); // Set the Drawable displayed
Drawable bitmap = getResources().getDrawable(R.drawable.wallpaper);
mImageView.setImageDrawable(bitmap); // Attach a PhotoViewAttacher, which takes care of all of the zooming functionality.
mAttacher = new PhotoViewAttacher(mImageView);
} // If you later call mImageView.setImageDrawable/setImageBitmap/setImageResource/etc then you just need to call
attacher.update();

2、通过layout使用。

<uk.co.senab.photoview.PhotoView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/iv_photo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>

PS:如果需要旋转图片可以通过setRotationTo,setRotationBy实现,其他相关操作间示例代码:

/*******************************************************************************
* Copyright 2011, 2012 Chris Banes.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package uk.co.senab.photoview.sample; import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.TextView;
import android.widget.Toast; import java.io.File;
import java.io.FileOutputStream;
import java.util.Random; import uk.co.senab.photoview.PhotoViewAttacher;
import uk.co.senab.photoview.PhotoViewAttacher.OnMatrixChangedListener;
import uk.co.senab.photoview.PhotoViewAttacher.OnPhotoTapListener; public class SimpleSampleActivity extends Activity { static final String PHOTO_TAP_TOAST_STRING = "Photo Tap! X: %.2f %% Y:%.2f %% ID: %d";
static final String SCALE_TOAST_STRING = "Scaled to: %.2ff"; private TextView mCurrMatrixTv; private PhotoViewAttacher mAttacher; private Toast mCurrentToast; private Matrix mCurrentDisplayMatrix = null; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ImageView mImageView = (ImageView) findViewById(R.id.iv_photo);
mCurrMatrixTv = (TextView) findViewById(R.id.tv_current_matrix); Drawable bitmap = getResources().getDrawable(R.drawable.wallpaper);
mImageView.setImageDrawable(bitmap); // The MAGIC happens here!
mAttacher = new PhotoViewAttacher(mImageView); // Lets attach some listeners, not required though!
mAttacher.setOnMatrixChangeListener(new MatrixChangeListener());
mAttacher.setOnPhotoTapListener(new PhotoTapListener());
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return super.onCreateOptionsMenu(menu);
} @Override
public void onDestroy() {
super.onDestroy(); // Need to call clean-up
mAttacher.cleanup();
} @Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem zoomToggle = menu.findItem(R.id.menu_zoom_toggle);
assert null != zoomToggle;
zoomToggle.setTitle(mAttacher.canZoom() ? R.string.menu_zoom_disable : R.string.menu_zoom_enable); return super.onPrepareOptionsMenu(menu);
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_zoom_toggle:
mAttacher.setZoomable(!mAttacher.canZoom());
return true; case R.id.menu_scale_fit_center:
mAttacher.setScaleType(ScaleType.FIT_CENTER);
return true; case R.id.menu_scale_fit_start:
mAttacher.setScaleType(ScaleType.FIT_START);
return true; case R.id.menu_scale_fit_end:
mAttacher.setScaleType(ScaleType.FIT_END);
return true; case R.id.menu_scale_fit_xy:
mAttacher.setScaleType(ScaleType.FIT_XY);
return true; case R.id.menu_scale_scale_center:
mAttacher.setScaleType(ScaleType.CENTER);
return true; case R.id.menu_scale_scale_center_crop:
mAttacher.setScaleType(ScaleType.CENTER_CROP);
return true; case R.id.menu_scale_scale_center_inside:
mAttacher.setScaleType(ScaleType.CENTER_INSIDE);
return true; case R.id.menu_scale_random_animate:
case R.id.menu_scale_random:
Random r = new Random(); float minScale = mAttacher.getMinimumScale();
float maxScale = mAttacher.getMaximumScale();
float randomScale = minScale + (r.nextFloat() * (maxScale - minScale));
mAttacher.setScale(randomScale, item.getItemId() == R.id.menu_scale_random_animate); showToast(String.format(SCALE_TOAST_STRING, randomScale)); return true;
case R.id.menu_matrix_restore:
if (mCurrentDisplayMatrix == null)
showToast("You need to capture display matrix first");
else
mAttacher.setDisplayMatrix(mCurrentDisplayMatrix);
return true;
case R.id.menu_matrix_capture:
mCurrentDisplayMatrix = mAttacher.getDisplayMatrix();
return true;
case R.id.extract_visible_bitmap:
try {
Bitmap bmp = mAttacher.getVisibleRectangleBitmap();
File tmpFile = File.createTempFile("photoview", ".png",
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
FileOutputStream out = new FileOutputStream(tmpFile);
bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
out.close();
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/png");
share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(tmpFile));
startActivity(share);
Toast.makeText(this, String.format("Extracted into: %s", tmpFile.getAbsolutePath()), Toast.LENGTH_SHORT).show();
} catch (Throwable t) {
t.printStackTrace();
Toast.makeText(this, "Error occured while extracting bitmap", Toast.LENGTH_SHORT).show();
}
return true;
} return super.onOptionsItemSelected(item);
} private class PhotoTapListener implements OnPhotoTapListener { @Override
public void onPhotoTap(View view, float x, float y) {
float xPercentage = x * 100f;
float yPercentage = y * 100f; showToast(String.format(PHOTO_TAP_TOAST_STRING, xPercentage, yPercentage, view == null ? 0 : view.getId()));
}
} private void showToast(CharSequence text) {
if (null != mCurrentToast) {
mCurrentToast.cancel();
} mCurrentToast = Toast.makeText(SimpleSampleActivity.this, text, Toast.LENGTH_SHORT);
mCurrentToast.show();
} private class MatrixChangeListener implements OnMatrixChangedListener { @Override
public void onMatrixChanged(RectF rect) {
mCurrMatrixTv.setText(rect.toString());
}
} }

Android开源库--PhotoView图片查看的更多相关文章

  1. GitHub上排名前100的Android开源库介绍(来自github)

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...

  2. GitHub Top 100的Android开源库

    摘要: 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best M... 本项目主要对目前 GitH ...

  3. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

  4. <Android开源库 ~ 1> GitHub Android Libraries Top 100 简介

    转载自GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitH ...

  5. GitHub上排名前100的Android开源库介绍

    GitHub上排名前100的Android开源库介绍 文章来源: http://www.open-open.com/news/view/1587067#6734290-qzone-1-31660-bf ...

  6. Android 开源库和项目 3

    Android 开源库和项目 Android 开源库和项目 2 1.Matisse Android 图片选择器 -- 知乎开源 github 地址:https://github.com/zhihu/M ...

  7. 【Java&amp;Android开源库代码分析】のandroid-async-http の开盘

          在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正 ...

  8. Android 开源库获取途径整理

    介绍眼下收藏 Android 开源库比較多的 GitHub 项目.站点.Twitter.App 及怎样获取最新的 Android 开源库. 微信号: 1. GitHub Android 开源项目汇总 ...

  9. 100个Github上Android开源库

    项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, ...

随机推荐

  1. frequentism-and-bayesianism-chs-iv

    frequentism-and-bayesianism-chs-iv 频率主义与贝叶斯主义 IV:Python的贝叶斯工具   这个notebook出自Pythonic Perambulations的 ...

  2. UML建模类型(转载)

    区分UML模型, UML建模用于不同类型的不同的图.有三个重要类型的UML建模: 结构建模: 系统结构建模捕捉静态功能.它们包括下列各项: 类图 对象图 部署图 包图 复合结构图 组件图 结构模型代表 ...

  3. php弱类型

    此处写ctf中遇到的==和md5值为0e**的应用. 数组和字符的===   ==

  4. 整数划分 Integer Partition(二)

    本文是整数划分的第二节,主要介绍整数划分的一些性质. 一 先来弥补一下上一篇文章的遗留问题:要求我们所取的 (n=m1+m2+...+mi )中  m1 m2 ... mi连续,比如5=1+4就不符合 ...

  5. WCF分布式开发步步为赢(3)WCF服务元数据交换、配置及编程开发

    今天我们继续WCF分布式开发步步为赢(3)WCF服务元数据交换.配置及编程开发的学习.经过前面两节的学习,我们了解WCF分布式开发的相关的基本的概念和自定义宿主托管服务的完整的开发和配置过程.今天我们 ...

  6. Servlet3.0-使用注解定义Servlet

    我使用的开发环境:MyEclipse10+Tomcat7+JDK6. 开发Servlet3的程序需要一定的环境支持.Servlet3是Java EE6规范的一部分,MyEclipse10和Tomcat ...

  7. sql只修改第一二行数据

    update t_table set colname=*  where a=1 order by id desc limit 1,2

  8. Jmeter 快速入门教程(三-3) -- 使用参数化

    参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进 ...

  9. Shell脚本基础II

    1.shell算术运算 1)加法 r=`expr 4 + 5`(注意! '4' '+' '5' 这三者之间要有空白) r=$[ 4 + 5 ] r=$(( 4 + 5 )) echo $r 2)乘法 ...

  10. Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)

    前两章我为大家详细介绍了如何搭建Maven环境.Spring MVC的流程结构.Spring MVC与Struts2的区别以及示例中的一些配置文件的分析.在这一章,我就对示例的层次结构进行说明,以及M ...