图片放大问题的通用图像装载机和查看传呼机 [英] Image Zoom Issue with Universal Image Loader and View Pager
问题描述
我想使用ImageViewZoom在ImagePagerActivity通用图像装载机。
我能够形象,滑动缩放到下一个图像。但我现在面临的问题,当图像在变焦位置。
如果图像被放大,我在中锋位置上,如果我希望看到相同的图像的右侧部分,刷卡离开它要下一个图像。请帮我做这个。
这里是我的XML code:
<的FrameLayout的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
机器人:填充=1dip>
< it.sephiroth.android.library.imagezoom.ImageViewTouch
机器人:layout_weight =1
机器人:ID =@ + ID /图像
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
机器人:scaleType =fitCenter/>
<进度
机器人:ID =@ + ID /加载
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:layout_gravity =中心
机器人:能见度=水涨船高/>
< /的FrameLayout>
编辑:
感谢您NOSTRA,我现在能够控制缩放和滑动与下面code。但随着多问题触摸变焦。我不能够放大用两个手指。
下面是我的previous code(工作正常用两个手指):
公共类ScaleListener扩展ScaleGestureDetector.SimpleOnScaleGestureListener {
@覆盖
公共布尔onScale(ScaleGestureDetector检测器){
Log.d(LOG_TAGonScale);
浮动跨度= detector.getCurrentSpan() - detector.get previousSpan();
浮targetScale = mCurrentScaleFactor * detector.getScaleFactor();
如果(mScaleEnabled){
targetScale = Math.min(getMaxZoom(),Math.max(targetScale,getMinZoom() - 0.1F));
zoomTo(targetScale,detector.getFocusX(),detector.getFocusY());
mCurrentScaleFactor = Math.min(getMaxZoom(),Math.max(targetScale,getMinZoom() - 1.0F));
mDoubleTapDirection = 1;
无效();
返回true;
}
返回false;
}
}
和下面是修改之一:
公共类ScaleListener扩展ScaleGestureDetector.SimpleOnScaleGestureListener {
@覆盖
公共布尔onScaleBegin(ScaleGestureDetector检测器){
externalScaleListener.onScaleBegin();
返回super.onScaleBegin(探测器);
}
@覆盖
公共无效onScaleEnd(ScaleGestureDetector检测器){
externalScaleListener.onScaleEnd(mCurrentScaleFactor);
}
}
首先,你必须能够听的图像缩放。 ImageViewTouch不支持此功能(如手势ImageView的支持),所以你应该自己实现了。
修改 ImageViewTouch.java
是这样的:
公共类ImageViewTouch扩展ImageViewTouchBase {
...
私人OnPageScaleListener externalScaleListener;
公共无效setOnScaleListener(OnPageScaleListener onScaleListener){
this.externalScaleListener = onScaleListener;
}
公共接口OnPageScaleListener {
无效onScaleBegin();
无效onScaleEnd(浮动比例);
}
@覆盖
保护无效onZoom(浮动比例){
super.onZoom(规模);
如果(!mScaleDetector.isInProgress()){
mCurrentScaleFactor =规模;
externalScaleListener.onScaleEnd(规模);
}
}
公共类ScaleListener扩展ScaleGestureDetector.SimpleOnScaleGestureListener {
@覆盖
公共布尔onScaleBegin(ScaleGestureDetector检测器){
externalScaleListener.onScaleBegin();
返回super.onScaleBegin(探测器);
}
...
@覆盖
公共无效onScaleEnd(ScaleGestureDetector检测器){
externalScaleListener.onScaleEnd(mCurrentScaleFactor);
}
}
...
}
然后用接下来的实施 ViewPager
的应用程序中的:
进口android.content.Context;
进口android.support.v4.view.ViewPager;
进口android.util.AttributeSet;
进口android.view.MotionEvent;
/ **
* {@link ViewPager}可停用(忽略触摸事件)
*
* @author谢尔盖Tarasevich
* @Created 2012年7月19日
* /
公共类DeactivableViewPager扩展ViewPager {
私人布尔激活= TRUE;
公共DeactivableViewPager(上下文的背景下){
超(上下文);
}
公共DeactivableViewPager(上下文的背景下,ATTRS的AttributeSet){
超(背景下,ATTRS);
}
公共无效启动(){
激活= TRUE;
}
公共无效停用(){
激活= FALSE;
}
@覆盖
公共布尔onInterceptTouchEvent(MotionEvent事件){
如果(激活){
尝试 {
返回super.onInterceptTouchEvent(事件);
}赶上(例外五){//有时会发生
返回true;
}
} 其他 {
返回false;
}
}
@覆盖
公共布尔的onTouchEvent(MotionEvent事件){
尝试 {
返回super.onTouchEvent(事件);
}赶上(例外五){
返回true;
}
}
}
然后在您的ViewPager的适配器,你应该设置一个比额表监听器为您ImageViewTouch:
ImageViewTouch的ImageView = ...;
imageView.setOnScaleListener(新OnPageScaleListener(){
@覆盖
公共无效onScaleBegin(){
viewPager.deactivate();
}
@覆盖
公共无效onScaleEnd(浮动比例){
如果(规模> 1.0){
viewPager.deactivate();
} 其他 {
viewPager.activate();
}
}
});
imageLoader.displayImage(URL,ImageView的,...);
,不要忘记在ImageLoader的配置设置大值 maxImage *** ForMemoryCache
所以UIL进行解码,以位图过程中不会降尺度的原始图像:
ImageLoaderConfiguration配置=新ImageLoaderConfiguration.Builder(getApplicationContext())
...
.memoryCacheExtraOptions(3000,3000)
...
。建立();
I'd like to use ImageViewZoom with Universal Image Loader in ImagePagerActivity.
I am able to zoom the image, Swipe to the next image. But i am facing problem when image is in Zoom position.
if an image is zoomed and i am at center position, if i want to see the right side part of the same image and swipe left it is going to the next image. Please help me in doing this.
here is my XML code:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="1dip" >
<it.sephiroth.android.library.imagezoom.ImageViewTouch
android:layout_weight="1"
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitCenter" />
<ProgressBar
android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone" />
</FrameLayout>
EDIT:
Thank you NOSTRA, Now i am able to control the zoom and slide with the below code. But the problem with Multi touch zoom. I am not able to zoom with two fingers.
Here is my previous code(working fine with two finger):
public class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale( ScaleGestureDetector detector ) {
Log.d( LOG_TAG, "onScale" );
float span = detector.getCurrentSpan() - detector.getPreviousSpan();
float targetScale = mCurrentScaleFactor * detector.getScaleFactor();
if ( mScaleEnabled ) {
targetScale = Math.min( getMaxZoom(), Math.max( targetScale, getMinZoom()-0.1f ) );
zoomTo( targetScale, detector.getFocusX(), detector.getFocusY() );
mCurrentScaleFactor = Math.min( getMaxZoom(), Math.max( targetScale, getMinZoom()-1.0f ) );
mDoubleTapDirection = 1;
invalidate();
return true;
}
return false;
}
}
And here is the Modified one:
public class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
externalScaleListener.onScaleBegin();
return super.onScaleBegin(detector);
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
externalScaleListener.onScaleEnd(mCurrentScaleFactor);
}
}
First you must be able to listen scaling of image. ImageViewTouch doesn't support this feature (e.g gesture-imageview support it) so you should implement it yourself.
Change ImageViewTouch.java
like this:
public class ImageViewTouch extends ImageViewTouchBase {
...
private OnPageScaleListener externalScaleListener;
public void setOnScaleListener(OnPageScaleListener onScaleListener) {
this.externalScaleListener = onScaleListener;
}
public interface OnPageScaleListener {
void onScaleBegin();
void onScaleEnd(float scale);
}
@Override
protected void onZoom(float scale) {
super.onZoom(scale);
if (!mScaleDetector.isInProgress()) {
mCurrentScaleFactor = scale;
externalScaleListener.onScaleEnd(scale);
}
}
public class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
externalScaleListener.onScaleBegin();
return super.onScaleBegin(detector);
}
...
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
externalScaleListener.onScaleEnd(mCurrentScaleFactor);
}
}
...
}
Then use next implementation of ViewPager
in your application:
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* {@link ViewPager} which can be deactivated (ignore touch events)
*
* @author Sergey Tarasevich
* @created 19.07.2012
*/
public class DeactivableViewPager extends ViewPager {
private boolean activated = true;
public DeactivableViewPager(Context context) {
super(context);
}
public DeactivableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void activate() {
activated = true;
}
public void deactivate() {
activated = false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (activated) {
try {
return super.onInterceptTouchEvent(event);
} catch (Exception e) { // sometimes happens
return true;
}
} else {
return false;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
try {
return super.onTouchEvent(event);
} catch (Exception e) {
return true;
}
}
}
Then in your ViewPager's adapter you should set next scale listener for your ImageViewTouch:
ImageViewTouch imageView = ...;
imageView.setOnScaleListener(new OnPageScaleListener() {
@Override
public void onScaleBegin() {
viewPager.deactivate();
}
@Override
public void onScaleEnd(float scale) {
if (scale > 1.0) {
viewPager.deactivate();
} else {
viewPager.activate();
}
}
});
imageLoader.displayImage(url, imageView, ...);
And don't forget set big values for maxImage***ForMemoryCache
in ImageLoader's configuration so UIL won't downscale original images during decoding to Bitmaps:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
...
.memoryCacheExtraOptions(3000, 3000)
...
.build();
这篇关于图片放大问题的通用图像装载机和查看传呼机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!