項目地址:https://github.com/chrisbanes/PhotoView
用開源項目有個好處,一是實現簡單,二是bug少。那么我們就來說下這個項目能夠實現的效果:
1.單個圖片的雙指縮放,雙擊放大縮小
PhotoViewAttacher mAttacher; ImageView mImageView; @Override protected 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.ic_launcher); mImageView.setImageDrawable(bitmap); // Attach a PhotoViewAttacher, which takes care of all of the zooming // functionality. mAttacher = new PhotoViewAttacher(mImageView);
2.圖片的旋轉效果,可以精准指定旋轉的度數
private PhotoView photo; private final Handler handler = new Handler(); private boolean rotating = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); photo = new PhotoView(this); photo.setImageResource(R.drawable.wallpaper); setContentView(photo); photo.setRotationBy(10); }
3.放入viewpager來做照片瀏覽,瀏覽中可以放大和縮小(這里的viewpager可以設置是否允許左右滑動,如果不用這功能,就直接用普通的viewpager)
private static final String ISLOCKED_ARG = "isLocked"; private ViewPager mViewPager; private MenuItem menuLockItem; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_pager); mViewPager = (HackyViewPager) findViewById(R.id.view_pager); setContentView(mViewPager); mViewPager.setAdapter(new SamplePagerAdapter()); if (savedInstanceState != null) { boolean isLocked = savedInstanceState.getBoolean(ISLOCKED_ARG, false); ((HackyViewPager) mViewPager).setLocked(isLocked); } } static class SamplePagerAdapter extends PagerAdapter { private static final int[] sDrawables = { R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper }; @Override public int getCount() { return sDrawables.length; } @Override public View instantiateItem(ViewGroup container, int position) { //定義可以縮放的圖片對象 PhotoView photoView = new PhotoView(container.getContext()); photoView.setImageResource(sDrawables[position]); // Now just add PhotoView to ViewPager and return it container.addView(photoView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); return photoView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } }
這是官方文檔的例子
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();
下面給出的源碼是我修改過的,我把原來的放大兩次變成了放大一次,然后再雙擊的話就縮小到原圖。至於單擊直接退出的效果我給出一個思路,點擊一個縮略圖后開啟一個activity,用漸變的效果顯示。在這個彈出的activity放一個可以縮放的圖片,然后給這個圖片加個監聽器(源碼中我已經加了),點擊后這個activity漸變消失。很簡單吧~ 不過這里面需要注意的是縮略圖的設置還有彈出activity時很可能要用進度條來等待網絡圖片