Бесконечная галерея изображений с двойной вкладкой и Pinch Zoom

У меня есть приложение, одним из его действий является бесконечный камбуз с изображениями, хранящимися в папке res drawable,

я пытаюсь иметь двойную вкладку и Pinch Zoom для изображений,

я искал в Google ни одного примера, связанного с эффектом масштабирования с бесконечной галереей,

любые советы будут оценены.

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

<?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>

ОБНОВЛЕНИЕ:

согласно ответу Йоанна Эркуэта, я заменяю этот код:

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

со следующим кодом ниже:

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

также настройте 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); 
}
}   
}

И если я использую свой модифицированный класс с моим исходным 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>

это дало принудительное закрытие с помощью приведенного ниже логарифма:

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

И если я использую модифицированный класс с моим измененным 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"
 />

это также дало принудительное закрытие с помощью приведенного ниже логарифма:

  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

ОБНОВЛЕНИЕ 2

введите здесь описание изображения


person Android Stack    schedule 14.08.2013    source источник


Ответы (5)


вы можете использовать собственный элемент управления imagGallery.. проверьте это https://github.com/kilaka/ImageViewZoom, вы можете проведите изображения в виде галереи и в состоянии сделать масштабирование. в этом примере у вас есть класс адаптера.. проверьте его.

person Sanket Kachhela    schedule 14.08.2013
comment
пожалуйста, не могли бы вы упростить свой ответ с помощью некоторого кода, соответствующего моему коду, я проверяю предоставленную вами ссылку, на самом деле я не могу решить свою проблему с этим проектом, спасибо - person Android Stack; 19.08.2013
comment
пожалуйста, не могли бы вы объяснить больше с помощью фрагмента кода, как добавить его в мой класс DayGallery, спасибо - person Android Stack; 26.08.2013

Вы можете использовать мой проект Pinch to zoom Gallery. Вы можете выбрать любое изображение из галереи, а затем в onDoubleTap(MotionEvent e) открыть полное изображение и увеличить его. Вы должны использовать два класса виджетов PinchZoomGallery, TouchImageView и класс активности PinchZoomActivity или добавить функциональность галереи в свой класс активности.

person Artyom Kiriliyk    schedule 20.08.2013
comment
пожалуйста, не могли бы вы объяснить больше с помощью фрагмента кода, как добавить его в мой класс DayGallery, спасибо - person Android Stack; 26.08.2013
comment
Почему ваша галерея бесконечна? 120 изображений — это не бесконечность. Измените свой класс InfiniteGallery на мой класс PinchZoomGallery (добавьте день проверки 1 и т. д.), затем измените класс InfiniteGalleryAdapter на мой класс ImageAdapter и добавьте функциональность TextView. Удалите GestureImageView и добавьте TouchImageView. Удалите ненужный код из onCreate и добавьте этот super.onCreate(savedInstanceState); setContentView(R.layout.main); gallery = (PinchZoomGallery) findViewById(R.id.gallery); gallery.setSpacing(15); gallery.setAdapter(new ImageAdapter(this)); gallery.setSelection(1); - person Artyom Kiriliyk; 27.08.2013

Я использую PhotoView в своих проектах. Это похоже на GestureImageView, который вы пытаетесь использовать сейчас.

Вот пример использования 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>

В вашем коде Java вы можете использовать его, как если бы это был простой ImageView. Вот мой код (я использовал 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);
        }
    }
}

У вас есть ошибка в коде метода public View getView(int position, View convertView, ViewGroup parent). Вы создаете GestureImageView в строке 96, но после этого не используете его. Вместо этого вы увеличиваете содержимое gallery_items.xml и возвращаете его. Я предполагаю, что 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>

Затем вы можете упростить метод 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;
}

Если у вас возникли проблемы с запуском кода, я могу собрать для вас простой проект галереи. :)

person Samuil Yanovski    schedule 26.08.2013

В своих приложениях я использую следующую библиотеку: https://github.com/jasonpolites/gesture-imageview

Эта библиотека предлагает то, что вы просите (двойное нажатие и масштабирование), а также другие функции.

Вы можете программно настроить образ следующим образом:

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

Тогда вам просто нужно добавить представление в свой макет, в вашем случае идея заключалась бы в том, чтобы предоставить эти представления вашему InfiniteGalleryAdapter, но я не нашел много информации об этой библиотеке.

Этот класс довольно легко настроить, просто интегрируйте его в свой проект и следуйте примеру по ссылке.

ИЗМЕНИТЬ:

Изменения должны быть сделаны в вашей InfiniteGalleryAdapter, я думаю, вы можете попробовать, изменив свою функцию getImageView следующим образом:

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

    return i; 
} 

Вам также может понадобиться изменить часть 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); 
} 

Для XML есть пример на веб-сайте, откуда взята библиотека. В нашем случае GestureImageView добавляется программно, поэтому кажется, что вам просто нужно немного изменить файл 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:

Вот чем можно попробовать заблокировать прокрутку от "сжигания" события, заменить оригинальную функцию onTouch из класса GestureImageViewTouchListener на приведенную ниже, я просто добавил проверку на действие движения:

@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;
        }
    }
person Yoann Hercouet    schedule 22.08.2013
comment
я добавляю эту библиотеку в свой проект, но, пожалуйста, не могли бы вы объяснить с помощью фрагмента кода, как добавить ее в мой класс DayGallery, спасибо - person Android Stack; 25.08.2013
comment
мне нужно добавить что-нибудь в макет .xml - person Android Stack; 26.08.2013
comment
пожалуйста, проверьте обновление main.xml, правильно ли оно или оставьте его как предыдущий, спасибо - person Android Stack; 26.08.2013
comment
Проблема не в коде, который я здесь привел, кажется, вы не добавили класс InfiniteGallery в свой проект. Пожалуйста, исправьте это сначала, если вы хотите пойти дальше. - person Yoann Hercouet; 26.08.2013
comment
мой проект уже работает и появляется бесконечная галерея, но я думаю что-то с макетом - person Android Stack; 26.08.2013
comment
В одних случаях вы ставите com.tsn.dr.InfiniteGallery, в других com.test.demo.InfiniteGallery. Вы должны указать путь к пакету, в который вы установили библиотеку. - person Yoann Hercouet; 26.08.2013
comment
это уже com.test.demo.InfiniteGallery, я настроил его с тем же результатом - person Android Stack; 26.08.2013
comment
Я добавил XML, который вы можете попробовать. Я следовал примеру здесь: github.com/jasonpolites/gesture-imageview/blob/master/example/ - person Yoann Hercouet; 26.08.2013
comment
сейчас это работает, но я потерял возможность прокрутки, когда мой палец на изображении, но он нормально прокручивается пальцем по тексту (мой макет xml показывает изображение в верхних двух третях экрана и текст под ним в нижней трети) вы меня понимаете, спасибо - person Android Stack; 27.08.2013
comment
Попробуйте добавить view.setAdjustViewBounds(true); во время создания GestureImageView. Я обновил ответ. - person Yoann Hercouet; 27.08.2013
comment
Вероятно, это связано с тем, что GestureImageView использует событие касания, поэтому Галерея никогда не получает информацию об этих касаниях. Не уверен, что это поможет, но вы можете попробовать отредактировать метод onTouch (View v, событие MotionEvent) в классе GestureImageViewTouchListener — заставить его возвращать false вместо true. Таким образом, ОС будет думать, что эти уведомления еще не обработаны, и отправит их в родительское представление - в вашем случае в галерею. - person Samuil Yanovski; 27.08.2013
comment
@Yoann Hercouet Я добавляю view.setAdjustViewBounds(true); но все равно, пожалуйста, проверьте UPDATE2, СПАСИБО - person Android Stack; 27.08.2013
comment
Я думаю, что Самуил может быть прав, слушатель уже обрабатывает событие onTouch. Возможно, вы можете отфильтровать действие движения в функции, я добавлю в свой ответ, что я подразумеваю под этим, но я не могу гарантировать, что это сработает, вам придется запустить некоторые тесты. - person Yoann Hercouet; 27.08.2013
comment
@Yoann Hercouet, это не решает, пожалуйста, если у вас есть другие советы, спасибо - person Android Stack; 27.08.2013
comment
َ@Yoann Hercouet, мой друг, я до сих пор не могу решить эту проблему, но ты заслуживаешь награды, если доберешься до чего-то нового, пожалуйста, дай мне знать, спасибо. - person Android Stack; 27.08.2013
comment
Спасибо :-). Я думаю, вы сейчас очень близки к решению, я думаю, вам следует создать еще один вопрос, чтобы представить эту последнюю проблему, когда прокрутка не работает с изображением. Я уверен, что вы получите хорошие отзывы, чтобы решить эту последнюю проблему. - person Yoann Hercouet; 27.08.2013

Я думаю, что ваш ClassNotFoundException связан с тем, что среда выполнения Android пытается создать экземпляр com.tsn.dr.InfiniteGallery, который вы указали в своей деятельности:

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

Но класс InfiniteGallery является закрытым и находится внутри DayGallery:

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

Сделайте его общедоступным и исправьте путь к пакету в XML-файле, чтобы он соответствовал фактическому пространству имен. (извините за терминологию С#, не работал с Android несколько месяцев)

person Zachary Yates    schedule 26.08.2013
comment
это другое имя backage по ошибке, потому что у меня есть основной большой проект и небольшой проект только для проверки эффекта масштабирования, поэтому нет проблем с именем пакета, оно правильно для каждого проекта, спасибо, я попробую изменить частный на общедоступный - person Android Stack; 27.08.2013