PhotoView — масштабируемый ImageView

Здравствуйте, сегодня к нам на обзор попала библиотека PhotoView.

Она позволяет масштабировать изображение классическим открывающим щипком или двойным тапом. Автором библиотеки является небезызвестный Chris Banes. Ниже представлен простейший пример использования библиотеки.

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<uk.co.senab.photoview.PhotoView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/iv_photo"
  android:layout_width="match_parent"android:layout_height="match_parent"/>

MainActivity.java:

import uk.co.senab.photoview.*;
import android.os.*;
import android.app.*;

public class MainActivity extends Activity{

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.photo_view);

    PhotoView photoView = (PhotoView)findViewById(R.id.iv_photo);
    photoView.setImageResource(R.drawable.wallpaper);

  }

}

 

PhotoView и ViewPager

Практически во всех приложениях, в которых есть масштабируемый ImageView, он используется вместе с ViewPager’ом. Обычный ViewPager нам не подойдет, поэтому создадим его наследника — HackyViewPager.

HackyViewPager.java:

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class HackyViewPager extends ViewPager {

  private boolean isLocked;

  public HackyViewPager(Context context) {
    super(context);
    isLocked = false;
  }

  public HackyViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    isLocked = false;
  }

  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {

    if (!isLocked) {
      try {
        return super.onInterceptTouchEvent(ev);
      } catch (IllegalArgumentException e) {
        e.printStackTrace();
        return false;
    }
  }
return false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isLocked) {
return super.onTouchEvent(event);
}
return false;
}

public void toggleLock() {
isLocked = !isLocked;
}

public void setLocked(boolean isLocked) {
this.isLocked = isLocked;
}

public boolean isLocked() {
return isLocked;
}

}

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<ru.javahelp.photoview.HackyViewPager
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/view_pager"
  android:layout_width="match_parent"
  android:layout_height="match_parent" />

MainActivity.java:

public class MainActivity extends Activity {

private static final String ISLOCKED_ARG = "isLocked";

private ViewPager mViewPager;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_pager);

    mViewPager = (HackyViewPager) findViewById(R.id.view_pager);
    mViewPager.setAdapter(new ViewPagerAdapter());
  }

  private boolean isViewPagerActive() {
    return (mViewPager != null && mViewPager instanceof HackyViewPager);
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    if (isViewPagerActive()) {
      outState.putBoolean(ISLOCKED_ARG, ((HackyViewPager) mViewPager).isLocked());
    }
    super.onSaveInstanceState(outState);
  }

}

Также нам нужен кастомный адаптер. В нем мы будем добавлять PhotoView в контейнер:

ViewPagerAdapter.java:

import android.view.*;
import uk.co.senab.photoview.*;
import android.widget.TableRow.*;
import android.support.v4.view.*;

public class ViewPagerAdapter extends PagerAdapter {

  private static final int[] images = {R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper };

  @Override
  public int getCount() {
    return images.length;
  }

  @Override
  public View instantiateItem(ViewGroup container, int position) {

    PhotoView photoView = new PhotoView(container.getContext());
    photoView.setImageResource(images[position]);
    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;
  }
}

Пример работы библиотеки на Google Play: PhotoView.
Библиотека на GitHub: PhotoView.
Исходники примера: PhotoView.

Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *