【问题标题】:How to swipe images如何滑动图像
【发布时间】:2020-09-23 20:47:21
【问题描述】:

我正在尝试实现一个简单的图像库,其中我有一个图像要在设备屏幕上一次显示。当我们从左向右滑动屏幕时,它应该会显示下一张图片。
为此,我实现了一个视图翻转器并向其添加了图像视图。
但我不知道如何捕捉该滑动事件。
谁能告诉我一个例子?

【问题讨论】:

  • 你为什么要捕捉那个滑动事件?
  • 我想捕捉该滑动事件,以便根据滑动我可以从左到右更改图像,反之亦然

标签: android


【解决方案1】:

我的应用需要同样的东西,并使用了ViewPagerhttp://blog.sqisland.com/2012/09/android-swipe-image-viewer-with-viewpager.html

之前我使用了ImageSwitcherGestureDetectorhttp://blog.sqisland.com/2012/07/android-swipe-image-viewer.html

ViewPager 的代码更简单,体验也更好,因为手指在屏幕上滑动时图像会滑动。我直接创建ImageView,不需要碎片。

【讨论】:

  • 这应该是公认的答案!你刚刚用你的solution 度过了我的一天,并为我节省了数小时的劳动。非常感谢!!!
【解决方案2】:

您可以为您的 ViewPager 创建一个自定义 Pager Adapter:

public class ImageAdapter extends PagerAdapter {
    private Context context;
    private int[] GalImages = new int[]{
            R.drawable.cap8, R.drawable.cap2, R.drawable.cap3, R.drawable.cap1, R.drawable.cap5,
            R.drawable.cap6, R.drawable.cap7, R.drawable.cap9, R.drawable.cap4,
            R.drawable.cap10

    };

    ImageAdapter(Context context) {
        this.context = context;
    }

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

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ImageView imageView = new ImageView(context);
        int padding = context.getResources().getDimensionPixelSize(R.dimen.activity_horizontal_margin);
        imageView.setPadding(padding, padding, padding, padding);
        imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        imageView.setImageResource(GalImages[position]);
        container.addView(imageView, 0);
        return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((ImageView) object);
    }
}

在布局中使用 ViewPager 并注册适配器:

<android.support.v4.view.ViewPager
    android:id="@+id/mvieww"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

【讨论】:

    【解决方案3】:

    你也可以这样做,不使用视图翻转器

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    
    <ImageView
                     android:layout_width="match_parent"
                     android:layout_height="match_parent"
                     android:layout_gravity="center"
                     android:gravity="center"
                     android:layout_margin="10dip"
                     android:id="@+id/image_place_holder"
                     />
    
     </RelativeLayout>
    

    活动类

     public class MainActivity extends Activity  {
    
     private Integer[] mImageIds = { R.drawable.img1, R.drawable.img2,R.drawable.img3 };
    
    private static final String DEBUG_TAG = "MainActivity ";
    ImageView imageView;
    float startXValue = 1;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.gallery);
        imageView = (ImageView) findViewById(R.id.image_place_holder);
        imageView.setImageResource(mImageIds[num]);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {    
        float endXValue = 0;
        float x1 = event.getAxisValue(MotionEvent.AXIS_X);
        int action = MotionEventCompat.getActionMasked(event);
        switch (action) {
            case (MotionEvent.ACTION_DOWN):
                startXValue = event.getAxisValue(MotionEvent.AXIS_X);
    
                return true;
    
            case (MotionEvent.ACTION_UP):
                endXValue = event.getAxisValue(MotionEvent.AXIS_X);
                if (endXValue > startXValue) {
                    if (endXValue - startXValue > 100) {
                    System.out.println("Left-Right");
                    imageView.setImageResource(mImageIds[2]);
                    }
                }else {
                    if (startXValue -endXValue> 100) {
                    System.out.println("Right-Left");
                    imageView.setImageResource(mImageIds[0]);
    
                         }
                             }
            return true;
    
    
               default:
            return super.onTouchEvent(event);
         }
    
    }
    
    }
    

    【讨论】:

      【解决方案4】:

      您想使用Android Support Jar 中的ViewPager。这是一个教程:http://thepseudocoder.wordpress.com/2011/10/05/android-page-swiping-using-viewpager/

      您不想使用 Gallery,因为有些人建议它没有被弃用。但是从documentation 他们建议ViewPagerHorizantleScrollView 相对容易地解决这个问题:

      This class is deprecated.
          This widget is no longer supported. Other horizontally scrolling widgets include
          HorizontalScrollView and ViewPager from the support library.
      

      【讨论】:

      • IMO ViewPager 并不适用于所有情况。它通常与片段相关联,如果您只想使用单独的片段滑动图像,每次滑动似乎都过大了
      【解决方案5】:

      你可以这样做,它在没有任何视图的情况下正常工作

      public class Swipe extends Activity implements OnClickListener {
      
      private static final int SWIPE_MIN_DISTANCE = 120;
      //private static final int SWIPE_MAX_OFF_PATH = 250;
      private static final int SWIPE_THRESHOLD_VELOCITY = 200;
      final GestureDetector gdt = new GestureDetector(new GestureListener());
      private GestureDetector gestureDetector;
      ImageView img;
      
      
      View.OnTouchListener gestureListener;
      
      @Override
      public void onCreate(Bundle savedInstanceState) {
      
          super.onCreate(savedInstanceState);
          setContentView(R.layout.swipe);
          img = (ImageView)findViewById(R.id.imageView1swipe);
      
          img.setOnTouchListener(new OnTouchListener() {
              public boolean onTouch(final View view, final MotionEvent event) {
                  // TODO Auto-generated method stub
                  gdt.onTouchEvent(event);
                  //Log.i("Hello my Log 1","How dfgfd are you");
                  return true;
              }
          });
      

      并在您的 .java 中声明此方法

      private class GestureListener extends SimpleOnGestureListener {
              @Override
              public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                      float velocityY) {
                  Log.i("Hello my Log 2","How dfgfd are you");
                  if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                          && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
      
                      Log.i("dfsd", "Right to left");
                      return false; // Right to left
                  } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                          && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                      return false; // Left to right
                  }
      
                  if (e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE
                          && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
                      return false; // Bottom to top
                  } else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE
                          && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
                      return false; // Top to bottom
                  }
      
                  return false;
              }'
      

      可能是this 将帮助您安排所有的图像滑动

      【讨论】:

      【解决方案6】:

      我是这样实现的:

      package com.demoimageslider;
      
      import java.util.List;
      import java.util.Vector;
      
      import com.nineoldandroids.view.ViewHelper;
      
      import android.os.Bundle;
      import android.support.v4.app.Fragment;
      import android.support.v4.app.FragmentActivity;
      import android.support.v4.app.FragmentManager;
      import android.support.v4.app.FragmentPagerAdapter;
      import android.support.v4.view.ViewPager;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.view.ViewGroup;
      import android.widget.ImageView;
      
      public class MainActivity extends FragmentActivity {
      
          private PagerAdapter mPagerAdapter;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              this.initialisePaging();
          }
      
          private void initialisePaging() {
      
              List<Fragment> fragments = new Vector<Fragment>();
              fragments.add(Fragment.instantiate(this, Tab1Fragment.class.getName()));
              fragments.add(Fragment.instantiate(this, Tab2Fragment.class.getName()));
              fragments.add(Fragment.instantiate(this, Tab3Fragment.class.getName()));
              this.mPagerAdapter = new PagerAdapter(
                      super.getSupportFragmentManager(), fragments);
      
              ViewPager pager = (ViewPager) super.findViewById(R.id.pager);
              pager.setAdapter(this.mPagerAdapter);
              pager.setPageTransformer(true, new ZoomOutPageTransformer());
          }
      
          public static class Tab1Fragment extends Fragment {
      
              public View onCreateView(LayoutInflater inflater, ViewGroup container,
                      Bundle savedInstanceState) {
                  if (container == null) {
                      return null;
                  }
                  return (ImageView) inflater.inflate(R.layout.tab_frag1_layout,
                          container, false);
              }
          }
      
          public static class Tab2Fragment extends Fragment {
      
              public View onCreateView(LayoutInflater inflater, ViewGroup container,
                      Bundle savedInstanceState) {
                  if (container == null) {
                      return null;
                  }
                  return (ImageView) inflater.inflate(R.layout.tab_frag2_layout,
                          container, false);
              }
          }
      
          public static class Tab3Fragment extends Fragment {
      
              public View onCreateView(LayoutInflater inflater, ViewGroup container,
                      Bundle savedInstanceState) {
                  if (container == null) {
                      return null;
                  }
                  return (ImageView) inflater.inflate(R.layout.tab_frag3_layout,
                          container, false);
              }
          }
      
          public static class PagerAdapter extends FragmentPagerAdapter {
      
              private List<Fragment> fragments;
      
              public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
                  super(fm);
                  this.fragments = fragments;
              }
      
              @Override
              public Fragment getItem(int position) {
                  return this.fragments.get(position);
              }
      
              @Override
              public int getCount() {
                  return this.fragments.size();
              }
          }
      
          public static class ZoomOutPageTransformer implements
                  ViewPager.PageTransformer {
              private static final float MIN_SCALE = 0.85f;
              private static final float MIN_ALPHA = 0.5f;
      
              public void transformPage(View view, float position) {
                  int pageWidth = view.getWidth();
                  int pageHeight = view.getHeight();
      
                  if (position < -1) { // [-Infinity,-1)
                      // This page is way off-screen to the left.
                      // view.setAlpha(0);
                      ViewHelper.setAlpha(view, 0);
      
                  } else if (position <= 1) { // [-1,1]
                      // Modify the default slide transition to shrink the page as
                      // well
                      float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
                      float vertMargin = pageHeight * (1 - scaleFactor) / 2;
                      float horzMargin = pageWidth * (1 - scaleFactor) / 2;
                      if (position < 0) {
                          // view.setTranslationX(horzMargin - vertMargin / 2);
                          ViewHelper.setTranslationX(view, horzMargin - vertMargin
                                  / 2);
                      } else {
                          // view.setTranslationX(-horzMargin + vertMargin / 2);
                          ViewHelper.setTranslationX(view, -horzMargin + vertMargin
                                  / 2);
                      }
      
                      // Scale the page down (between MIN_SCALE and 1)
                      // view.setScaleX(scaleFactor);
                      // view.setScaleY(scaleFactor);
                      ViewHelper.setScaleX(view, scaleFactor);
                      ViewHelper.setScaleY(view, scaleFactor);
      
                      // Fade the page relative to its size.
                      // view.setAlpha(MIN_ALPHA +
                      // (scaleFactor - MIN_SCALE) /
                      // (1 - MIN_SCALE) * (1 - MIN_ALPHA));
      
                      ViewHelper.setAlpha(view, MIN_ALPHA + (scaleFactor - MIN_SCALE)
                              / (1 - MIN_SCALE) * (1 - MIN_ALPHA));
      
                  } else { // (1,+Infinity]
                      // This page is way off-screen to the right.
                      // view.setAlpha(0);
                      ViewHelper.setAlpha(view, 0);
                  }
              }
          }
      }
      

      我使用 Nineoldroids 库来支持旧 android 版本的效果。

      【讨论】:

        【解决方案7】:

        你为什么不使用画廊小部件来实现它?

        Here is the gallery tutorial.

        猜你喜欢
        • 2016-11-27
        • 1970-01-01
        • 2022-06-11
        • 2013-04-17
        • 1970-01-01
        • 2016-02-09
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        相关资源
        最近更新 更多