简体   繁体   English

无限画廊图像,双标签和缩放缩放

[英]Infinite gallery images with double tab and Pinch Zoom

I have app , one of its activity is infinite galley with images stored in res drawable folder , 我有app,它的一个活动是无限的厨房,图像存储在res drawable文件夹中,

im trying to have double tab and Pinch Zoom for images , 我想尝试双重标签和缩放图像,

i searched Google no any example related to zoom effect with infinite gallery , 我搜索谷歌没有任何与无限画廊缩放效果有关的例子,

any advice will be appreciated . 任何建议将被认真考虑 。

DayGallery.java: DayGallery.java:

 @SuppressWarnings("deprecation")
public class DayGallery extends Activity {
TextView tv;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);  
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
// Set the layout to use
setContentView(R.layout.main);
if (customTitleSupported) { 
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title); 
     tv = (TextView) findViewById(R.id.title_tv1); 
     tv.setTypeface(FontFactory.getBFantezy(getBaseContext()));
     }           
InfiniteGallery galleryOne = (InfiniteGallery) findViewById(R.id.galleryOne);
galleryOne.setAdapter(initializeImages()); 
galleryOne.setSelection(galleryOne.getCount()/2);  
}  

private InfiniteGalleryAdapter initializeImages() {
InfiniteGalleryAdapter galleryAdapter = null;

String day = getIntent().getStringExtra("dayname");

if(day.equalsIgnoreCase("Day1")){
    int[] tempimages = { R.drawable.day_one_1, R.drawable.day_one_2,R.drawable.day_one_3, 
            R.drawable.day_one_4, R.drawable.day_one_5,R.drawable.day_one_6,R.drawable.day_one_7,       
            R.drawable.day_one_8, R.drawable.day_one_9,R.drawable.day_one_10,R.drawable.day_one_11,
            R.drawable.day_one_12
    };  
    String[] name = { "00:35","00:35","00:35","1:07","2:00","2:01","2:09",
                      "2:12","2:15","6:13","6:13","6:13"
    };  
    tv.setText("Day one pictures");
    galleryAdapter=new InfiniteGalleryAdapter(this, tempimages, name); 
    }       
else if(day.equalsIgnoreCase("Day2")){
    int[] tempimages = { R.drawable.day_two_1, R.drawable.day_two_2,R.drawable.day_two_3, 
            R.drawable.day_two_4, R.drawable.day_two_5,R.drawable.day_two_6,R.drawable.day_two_7,
            R.drawable.day_two_8, R.drawable.day_two_9,R.drawable.day_two_10,R.drawable.day_two_11,
            R.drawable.day_two_12
    };  
    String[] name = { "12:04","12:04", "12:04","12:05","12:06", "12:07",
                      "12:07","12:07","12:08","12:10","12:10","12:10"
    };  
    tv.setText("Day two pictures"); 
    galleryAdapter=new InfiniteGalleryAdapter(this, tempimages, name); 
    }

// AND THE SAME FOR REST OF DAYS TILL Day10//

return galleryAdapter; 
}
}

class InfiniteGalleryAdapter extends BaseAdapter { 
private Context mContext;
private int[] images;   
private String[] name;
public InfiniteGalleryAdapter(Context c, int[] imageIds,String[] names) { 
this.mContext = c; 
images = imageIds;
name=names;
inflater = (LayoutInflater)mContext.getSystemService ( Context.LAYOUT_INFLATER_SERVICE); 
} 
public int getCount() { 
return Integer.MAX_VALUE; 
} 
public Object getItem(int position) { 
return position; 
} 
public long getItemId(int position) { 
return position; 
} 
private LayoutInflater inflater=null; 

public class ViewHolder{ 
public TextView text; 
public ImageView image; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
ImageView i = getImageView(); 

int itemPos = (position % images.length); 

try { i.setImageResource(images[itemPos]); ((BitmapDrawable) i.getDrawable()).setAntiAlias(true); 
} 
catch (OutOfMemoryError e) { Log.e("InfiniteGalleryAdapter", "Out of memory creating imageview. Using empty view.", e); 
} 
View vi=convertView; 
ViewHolder holder; 
if(convertView==null){ 
    vi = inflater.inflate(R.layout.gallery_items, null); 
    holder=new ViewHolder(); 
    holder.text=(TextView)vi.findViewById(R.id.textView1); 
    holder.image=(ImageView)vi.findViewById(R.id.image); 
    vi.setTag(holder); 
    } 
else holder=(ViewHolder)vi.getTag(); 
holder.text.setText(name[itemPos]); 

final int stub_id=images[itemPos]; 
holder.image.setImageResource(stub_id); 

return vi; 
} 

private ImageView getImageView() { 

ImageView i = new ImageView(mContext); 

return i; 
} 
}

 @SuppressWarnings("deprecation")
class InfiniteGallery extends Gallery {

public InfiniteGallery(Context context) {
super(context);
init(); 
}

public InfiniteGallery(Context context, AttributeSet attrs) {
super(context, attrs);
init(); 
}

public InfiniteGallery(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(); 
}

private void init(){
// These are just to make it look pretty
setSpacing(25);
setHorizontalFadingEdgeEnabled(false); 
}
}

main.xml main.xml中

<?xml version="1.0" encoding="utf-8" ?> 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
   android:layout_width="match_parent" 
   android:layout_height="match_parent" 
   android:orientation="vertical" 
   android:background="#FFDAB9">
 <com.test.demo.InfiniteGallery 
   android:id="@+id/galleryOne" 
   android:layout_width="match_parent" 
   android:layout_height="match_parent" /> 
</LinearLayout>

UPDATE: 更新:

as per Yoann Hercouet answer i replace this code : 根据Yoann Hercouet的回答我替换此代码:

 private ImageView getImageView() { 
  ImageView i = new ImageView(mContext); 
  return i; 
 } 
 }

with the following below code : 使用以下代码:

 private GestureImageView getImageView() {   
  GestureImageView i = new GestureImageView(mContext); 
   return i; 
  } 
  }

also adjust the getview , so finally my class will be as below : 还调整了getview,所以最后我的课程如下:

 @SuppressWarnings("deprecation")
public class DayGallery extends Activity {
 TextView tv;

    /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
   getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN);  
   getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
 Boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 

 setContentView(R.layout.main);
 if (customTitleSupported) { 
   getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title); 
     tv = (TextView) findViewById(R.id.title_tv1); 
     tv.setTypeface(FontFactory.getBFantezy(getBaseContext()));
    } 

 InfiniteGallery galleryOne = (InfiniteGallery) findViewById(R.id.galleryOne);
  galleryOne.setAdapter(initializeImages()); 
  galleryOne.setSelection(galleryOne.getCount()/2);  
  }  

 private InfiniteGalleryAdapter initializeImages() {
  InfiniteGalleryAdapter galleryAdapter = null;

   String day = getIntent().getStringExtra("dayname");

  if(day.equalsIgnoreCase("Day1")){
   int[] tempimages = { R.drawable.day_one_1, R.drawable.day_one_2,R.drawable.day_one_3, 
        R.drawable.day_one_4, R.drawable.day_one_5,R.drawable.day_one_6,R.drawable.day_one_7,       
        R.drawable.day_one_8, R.drawable.day_one_9,R.drawable.day_one_10,R.drawable.day_one_11,
        R.drawable.day_one_12
};  
String[] name = { "00:35","00:35","00:35","1:07","2:00","2:01","2:09",
                  "2:12","2:15","6:13","6:13","6:13"
};  
tv.setText("Day one pictures");
galleryAdapter=new InfiniteGalleryAdapter(this, tempimages, name); 
}       
else if(day.equalsIgnoreCase("Day2")){
   int[] tempimages = { R.drawable.day_two_1, R.drawable.day_two_2,R.drawable.day_two_3, 
        R.drawable.day_two_4, R.drawable.day_two_5,R.drawable.day_two_6,R.drawable.day_two_7,
        R.drawable.day_two_8, R.drawable.day_two_9,R.drawable.day_two_10,R.drawable.day_two_11,
        R.drawable.day_two_12
};  
String[] name = { "12:04","12:04", "12:04","12:05","12:06", "12:07",
                  "12:07","12:07","12:08","12:10","12:10","12:10"
};  
tv.setText("Day two pictures"); 
galleryAdapter=new InfiniteGalleryAdapter(this, tempimages, name); 
}

        // AND THE SAME FOR REST OF DAYS TILL Day10//

return galleryAdapter; 
 }
 }

 class InfiniteGalleryAdapter extends BaseAdapter { 
private Context mContext;
private int[] images;   
private String[] name;
public InfiniteGalleryAdapter(Context c, int[] imageIds,String[] names) { 
    this.mContext = c; 
    images = imageIds;
    name=names;
    inflater = (LayoutInflater)mContext.getSystemService ( Context.LAYOUT_INFLATER_SERVICE); 
    }

public int getCount() { 
    return Integer.MAX_VALUE; 
    } 

public Object getItem(int position) { 
    return position; 
    } 

public long getItemId(int position) { 
    return position; 
    } 

private LayoutInflater inflater=null; 

public class ViewHolder{ 
    public TextView text; 
    public ImageView image; 
    } 
public View getView(int position, View convertView, ViewGroup parent) { 
    GestureImageView i = getImageView(); 
    int itemPos = (position % images.length); 
    LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);//addition

    try { 
        i.setImageResource(images[itemPos]); 
        ((BitmapDrawable) i.getDrawable()).setAntiAlias(true);
        i.setLayoutParams(params); //addition
    } 
    catch (OutOfMemoryError e) { 
        Log.e("InfiniteGalleryAdapter", "Out of memory creating   imageview. Using empty view.", e); 
    } 
    View vi=convertView; 
    ViewHolder holder; 
    if(convertView==null){ 
        vi = inflater.inflate(R.layout.gallery_items, null); 
        holder=new ViewHolder(); 
        holder.text=(TextView)vi.findViewById(R.id.textView1); 
        holder.image=(ImageView)vi.findViewById(R.id.image); 
        vi.setTag(holder); 
        } 

    else holder=(ViewHolder)vi.getTag(); 
    holder.text.setText(name[itemPos]); 

    final int stub_id=images[itemPos]; 
    holder.image.setImageResource(stub_id); 

    return vi; 
    } 

 private GestureImageView getImageView() {   
   GestureImageView i = new GestureImageView(mContext); 
    return i; 
   } 

  @SuppressWarnings("deprecation")
  class InfiniteGallery extends Gallery {

public InfiniteGallery(Context context) {
    super(context);
    init(); 
    }

public InfiniteGallery(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(); 
    }

public InfiniteGallery(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(); 
    }

private void init(){
    // These are just to make it look pretty
    setSpacing(25);
    setHorizontalFadingEdgeEnabled(false); 
}
}   
}

AND if i use my modified class with my original main.xmla below : 如果我使用我原来的main.xmla修改过的类:

<?xml version="1.0" encoding="utf-8" ?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:orientation="vertical" 
  android:background="#FFDAB9">
<com.test.demo.InfiniteGallery
  android:id="@+id/galleryOne" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" /> 
</LinearLayout>

it gave force clos with the below logcat: 它使用下面的logcat强制关闭:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.demo/com.ttest.demo.DayGallery}: android.view.InflateException: Binary XML file line #7: Error inflating class com.test.demo.InfiniteGallery
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
   Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class com.tsn.dr.InfiniteGallery
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:216)
at android.app.Activity.setContentView(Activity.java:1660)
at com.test.demo.DayGallery.onCreate(DayGallery.java:35)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
... 11 more
  Caused by: java.lang.ClassNotFoundException: com.test.demo.InfiniteGallery in loader dalvik.system.PathClassLoader[/data/app/com.test.demo-1.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at android.view.LayoutInflater.createView(LayoutInflater.java:471)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570)
... 20 more

AND if i use the modified class with my modified main.xml as below : 如果我使用修改后的main.xml修改后的类,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 xmlns:gesture-image="http://schemas.polites.com/android"
  android:id="@+id/layout"
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:orientation="vertical" 
  android:background="#FFDAB9">
<com.test.demo.InfiniteGallery 
   android:id="@+id/galleryOne" 
   android:layout_width="match_parent" 
   android:layout_height="match_parent" /> 

 <com.polites.android.GestureImageView
   android:id="@+id/image"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent" 
   gesture-image:min-scale="0.75"
  gesture-image:max-scale="10.0"
 />

it gave also force close with the below logcat: 它还使用以下logcat强制关闭:

  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.demo/com.test.demo.DayGallery}: android.view.InflateException: Binary XML file line #9: Error inflating class com.test.demo.InfiniteGallery
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class com.test.demo.InfiniteGallery
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:216)
at android.app.Activity.setContentView(Activity.java:1660)
at com.test.demo.DayGallery.onCreate(DayGallery.java:35)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
... 11 more
  Caused by: java.lang.ClassNotFoundException: com.tsn.dr.InfiniteGallery in loader dalvik.system.PathClassLoader[/data/app/com.tsn.dr-1.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at android.view.LayoutInflater.createView(LayoutInflater.java:471)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570)
... 20 more

UPDATE 2 更新2

在此输入图像描述

you can use custom imagGallery control.. check this https://github.com/kilaka/ImageViewZoom you can swipe images as gallery view and able to do a pinch zoom. 您可以使用自定义imagGallery控件..检查此https://github.com/kilaka/ImageViewZoom您可以将图像作为图库视图滑动,并能够进行缩放缩放。 in this example you have a adapter class.. check it out. 在这个例子中你有一个适配器类..检查出来。

You can use my Pinch to zoom Gallery project. 您可以使用我的Pinch来缩放Gallery项目。 You can choose any image from gallery and then in onDoubleTap(MotionEvent e) open full image and zoom it. 您可以从图库中选择任何图像,然后在onDoubleTap(MotionEvent e)打开完整图像并进行缩放。 You should use two widget classes PinchZoomGallery , TouchImageView and activity class PinchZoomActivity or add gallery functionality into your activity class. 您应该使用两个窗口小部件类PinchZoomGalleryTouchImageView和活动类PinchZoomActivity或将库功能添加到您的活动类中。

I use the following library on my apps: https://github.com/jasonpolites/gesture-imageview 我在我的应用程序上使用以下库: https//github.com/jasonpolites/gesture-imageview

This library offers what you are asking (double tap and pinch zoom) along with other features. 该库提供您所要求的(双击和双指缩放)以及其他功能。

You can setup programmatically the image doing this: 您可以通过编程方式设置图像:

GestureImageView view = new GestureImageView(this);
view.setImageResource(R.drawable.image);
view.setAdjustViewBounds(true);
view.setLayoutParams(params);

Then you just need to add the view in your layout, in your case the idea would be to provide these views to your InfiniteGalleryAdapter but I did not find much information about this library. 然后你只需要在你的布局中添加视图,在你的情况下,想法是将这些视图提供给你的InfiniteGalleryAdapter但我没有找到关于这个库的很多信息。

This class is pretty easy to setup, just integrate it in your project and follow the example in the link. 这个类很容易设置,只需将它集成到您​​的项目中,并按照链接中的示例进行操作。

EDIT : 编辑

The changes must be done in your InfiniteGalleryAdapter , I think you can give it a try by changing your getImageView function this way: 必须在InfiniteGalleryAdapter完成更改,我想您可以通过以下方式更改getImageView函数来尝试:

private GestureImageView getImageView() {   
    GestureImageView i = new GestureImageView(mContext); 

    return i; 
} 

You might also need to modify the try part of your adapter to add the layout parameters: 您可能还需要修改适配器的try部分以添加布局参数:

public View getView(int position, View convertView, ViewGroup parent) { 
GestureImageView i = getImageView(); 

int itemPos = (position % images.length); 
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);//addition

try { 
    i.setImageResource(images[itemPos]); 
    ((BitmapDrawable) i.getDrawable()).setAntiAlias(true);
    i.setLayoutParams(params); //addition
} 
catch (OutOfMemoryError e) { 
    Log.e("InfiniteGalleryAdapter", "Out of memory creating   imageview. Using empty view.", e); 
} 

For the XML, there is an example in the website where the library is from. 对于XML,网站中有一个示例来自库。 In our case the GestureImageView is added programmatically, so it seems you just need to modify a little the XML file by adding the line xmlns:gesture-image="http://schemas.polites.com/android" : 在我们的例子中,GestureImageView是以编程方式添加的,所以你似乎只需要通过添加xmlns:gesture-image="http://schemas.polites.com/android"行来修改一些XML文件xmlns:gesture-image="http://schemas.polites.com/android"

<?xml version="1.0" encoding="utf-8" ?> 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:gesture-image="http://schemas.polites.com/android"
   android:layout_width="match_parent" 
   android:layout_height="match_parent" 
   android:orientation="vertical" 
   android:background="#FFDAB9">
<com.test.demo.InfiniteGallery 
   android:id="@+id/galleryOne" 
   android:layout_width="match_parent" 
   android:layout_height="match_parent" /> 
</LinearLayout>

EDIT2 : 编辑2

Here is what you can try to block the scroll from "burning" the event, replace the original onTouch function from the GestureImageViewTouchListener class by the one below, I just added a check on the motion action: 以下是您可以尝试阻止滚动“烧”事件,将GestureImageViewTouchListener类中的原始onTouch函数替换为下面的一个,我刚刚添加了对运动操作的检查:

@Override
    public boolean onTouch(View v, MotionEvent event) {

        if(event.getAction() != MotionEvent.ACTION_SCROLL){
            if(!inZoom) {

                if(!tapDetector.onTouchEvent(event)) {
                    if(event.getPointerCount() == 1 && flingDetector.onTouchEvent(event)) {
                        startFling();
                    }

                    if(event.getAction() == MotionEvent.ACTION_UP) {
                        handleUp();
                    }
                    else if(event.getAction() == MotionEvent.ACTION_DOWN) {
                        stopAnimations();

                        last.x = event.getX();
                        last.y = event.getY();

                        if(imageListener != null) {
                            imageListener.onTouch(last.x, last.y);
                        }

                        touched = true;
                    }
                    else if(event.getAction() == MotionEvent.ACTION_MOVE) {
                        if(event.getPointerCount() > 1) {
                            multiTouch = true;
                            if(initialDistance > 0) {

                                pinchVector.set(event);
                                pinchVector.calculateLength();

                                float distance = pinchVector.length;

                                if(initialDistance != distance) {

                                    float newScale = (distance / initialDistance) * lastScale;

                                    if(newScale <= maxScale) {
                                        scaleVector.length *= newScale;

                                        scaleVector.calculateEndPoint();

                                        scaleVector.length /= newScale;

                                        float newX = scaleVector.end.x;
                                        float newY = scaleVector.end.y;

                                        handleScale(newScale, newX, newY);
                                    }
                                }
                            }
                            else {
                                initialDistance = MathUtils.distance(event);

                                MathUtils.midpoint(event, midpoint);

                                scaleVector.setStart(midpoint);
                                scaleVector.setEnd(next);

                                scaleVector.calculateLength();
                                scaleVector.calculateAngle();

                                scaleVector.length /= lastScale;
                            }
                        }
                        else {
                            if(!touched) {
                                touched = true;
                                last.x = event.getX();
                                last.y = event.getY();
                                next.x = image.getImageX();
                                next.y = image.getImageY();
                            }
                            else if(!multiTouch) {
                                if(handleDrag(event.getX(), event.getY())) {
                                    image.redraw();
                                }
                            }
                        }
                    }
                }           
            }
            return true;
        } 
        else {
            return false;
        }
    }

I'm using PhotoView in my projects. 我在我的项目中使用PhotoView It is similar to the GestureImageView you're trying now. 它类似于你现在正在尝试的GestureImageView。

Here is an example of PhotoView's usage: 以下是PhotoView用法的示例:

<ProgressBar
    android:id="@+id/progress"
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:indeterminate="true"
    android:visibility="gone" />

<RelativeLayout
    android:id="@+id/content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <uk.co.senab.photoview.PhotoView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/buttonsContainer"
        android:layout_centerInParent="true"
        android:layout_marginBottom="@dimen/offset_vertical"
        android:layout_marginLeft="@dimen/offset_horizontal"
        android:layout_marginRight="@dimen/offset_horizontal"
        android:layout_marginTop="@dimen/offset_vertical"
        tools:ignore="ContentDescription" />

    <LinearLayout
        android:id="@+id/buttonsContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" >

        <Button
            android:id="@+id/makeAvatarButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/make_avatar" />

        <Button
            android:id="@+id/deleteButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/delete" />
    </LinearLayout>
</RelativeLayout>

In your Java code, you could use it as if it is a simple ImageView. 在Java代码中,您可以像使用简单的ImageView一样使用它。 Here is my code (I've used the UrlImageViewHelper to load images asynchronously): 这是我的代码(我使用UrlImageViewHelper以异步方式加载图像):

protected void processData() {
    View view = getView();
    if (null != view) {
        View makeAvatarButton = view.findViewById(R.id.makeAvatarButton);
        String link = JSONUtils.getLink(jsonData, "url");
        ImageView image = (ImageView) view.findViewById(R.id.image);
        UrlImageViewHelper.setUrlDrawable(image, link);

        boolean avatar = jsonData.optBoolean("avatar", false);
        if (avatar) {
            makeAvatarButton.setVisibility(View.GONE);
        } else {
            makeAvatarButton.setVisibility(View.VISIBLE);
        }
    }
}

You have an error in your code in the public View getView(int position, View convertView, ViewGroup parent) method. 您在公共View getView(int position,View convertView,ViewGroup parent)方法中的代码中有错误。 You create a GestureImageView at line 96, but you don't use it after that. 您在第96行创建了一个GestureImageView,但之后不再使用它。 Instead you are inflating the contents of gallery_items.xml and return them. 相反,您正在膨胀gallery_items.xml的内容并返回它们。 I guess gallery_items.xml contains just an image with a text label, so here is an example which should work fine: 我想gallery_items.xml只包含一个带有文本标签的图像,所以这里有一个应该正常工作的例子:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<uk.co.senab.photoview.PhotoView
    android:id="@+id/thumbnail"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="100dp"
    android:padding="5dp"
    android:scaleType="fitXY"
    tools:ignore="ContentDescription" >
</uk.co.senab.photoview.PhotoView>

<TextView
    android:id="@+id/label"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal" /></LinearLayout>

Then you could simplify your getView method to something like that: 然后你可以将你的getView方法简化为:

public View getView(int position, View convertView, ViewGroup parent) {
    int itemPos = (position % images.length);
    View vi = convertView;
    ViewHolder holder;
    if (convertView == null) {
        vi = inflater.inflate(R.layout.gallery_items, null);
        holder = new ViewHolder();
        holder.text = (TextView) vi.findViewById(R.id.textView1);
        holder.image = (ImageView) vi.findViewById(R.id.image);
        vi.setTag(holder);
    } else {
        holder = (ViewHolder) vi.getTag();
    }
    holder.text.setText(name[itemPos]);

    final int stub_id = images[itemPos];
    holder.image.setImageResource(stub_id);

    return vi;
}

If you have troubles running the code, I could assemble a simple gallery project for you. 如果您在运行代码时遇到麻烦,我可以为您组装一个简单的图库项目。 :) :)

I think your ClassNotFoundException is due to the android runtime trying to instantiate a com.tsn.dr.InfiniteGallery , which you specified in your activity: 我认为你的ClassNotFoundException是由于android运行时试图实例化你在活动中指定的com.tsn.dr.InfiniteGallery

<com.test.demo.InfiniteGallery 
android:id="@+id/galleryOne" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 

But the InfiniteGallery class is private, and inside DayGallery: 但InfiniteGallery类是私有的,在DayGallery中:

public class DayGallery {
    ....
    @SuppressWarnings("deprecation")
    class InfiniteGallery extends Gallery {

Make it public and fix the package path in the .xml to match it's actual namespace. 将其公开并修复.xml中的包路径以匹配其实际命名空间。 (sorry for the c# terminology, haven't done android work in a few months) (对不起c#术语,几个月没做过android工作)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM