2012-07-03 5 views
0

У меня есть viewpager, внутри которого я показываю видео и изображение. Пожалуйста, скажите мне, как я могу реализовать функциональность как масштабирование, панорамирование, перетащить в это.Как реализовать масштабирование, панорамирование и перетаскивание на Viewpager в android?

В моем представлении у меня есть видеообзор и изображение в нем, теперь я хочу, когда я выполняю масштабирование, он должен масштабировать оба вида. Расскажите, пожалуйста, об этом. Всюду, что я видел на форумах, я обнаружил, что люди работали над масштабированием панорамирования на одном представлении, например, в режиме просмотра изображений, но не на прямом представлении. В моем случае я должен напрямую обращаться с viewpager, чтобы все виды внутри него могли обрабатываться с помощью функций как масштабирование, панорамирование, перетаскивание независимо от количества видов внутри него. Помощь приветствуется. Благодарю.

ответ

0

Для изображений вы можете захотеть взглянуть на это =>android imageView: setting drag and pinch zoom parameters

Никогда не испытывал с видео на андроид так я не буду помогать вам в этом вопросе, но вы должны быть более четко о том, что вы собираетесь делать, может быть, дать какой-то код или объяснить, как ваше приложение построено?

+1

В моем представлении у меня есть видеообзор и изображение в нем, теперь я хочу, когда я выполняю масштабирование, он должен масштабировать оба вида. Расскажите, пожалуйста, об этом. Всюду, что я видел на форумах, я обнаружил, что люди работали над масштабированием панорамирования на одном представлении, например, в режиме просмотра изображений, но не на прямом представлении. В моем случае я должен напрямую обращаться с viewpager, чтобы все виды внутри него могли обрабатываться с помощью функций как масштабирование, панорамирование, перетаскивание независимо от количества видов внутри него. Помощь приветствуется. Благодарю. – Devavrata

2

после долгого R & D по этому я пришел к выводу можно управлять событиями непосредственно над компоновкой родителя, внутри которого ваша ViewPager является существующей это может быть для примера LinearLayout и т.д. Проверить эту ссылку:

http://myandroidnote.blogspot.in/2011/03/pinch-zoom-to-view-completely.html

Он не работает для всех функций, таких как панорамирование, перетаскивание, но с помощью кнопок вы можете управлять событиями, такими как масштабирование, уменьшение, нормальное и т. Д. Я много искал для такого типа вопросов, но никто не обращался к нему должным образом. Благодаря этому приятелю :)

8

Для масштабирования и Paning лучшей библиотеки, TouchImageView

, Но если мы добавим Это на виде пейджере будет аа вопросом, а сдвинув изображение, когда мы увеличение масштаба image.ie если я увеличиваю изображение и перетаскиваю его, чтобы увидеть другую увеличенную часть в правой части, из-за свойства прокрутки пейджера представления пейджер будет прокручивать изображение до следующего изображения. Это произойдет, если мы также сдвинем правое. Так исправление этого Isuue После длинного R & D i, наконец, сделал некоторые исправления. Для этого нам нужно сделать некоторые изменения в TouchImageView.java и viewpager

сначала нам нужно создать пользовательский ViewPager

MyViewPager.java

package com.example.gallery; 

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

public class MyViewPager extends ViewPager { 

private boolean enabled = true; 

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

@Override 
public boolean onInterceptTouchEvent(MotionEvent arg0) { 
    if(enabled) 
     return super.onInterceptTouchEvent(arg0); 

    return false; 
} 

public boolean isEnabled() { 
    return enabled; 
} 

public void setEnabled(boolean enabled) { 
    this.enabled = enabled; 
} 

}

После этого нужно изменить TouchImageView Класс Модифицированный Класс Ниже

Измененные части requestDisallowInterceptTouchEvent, добавленный к событию касания s и onDoubleTap Portion также изменен, чтобы пользователь мог прокручивать изображение до следующего изображения только после его уменьшения.При увеличении масштаба пользователя не может изменить текущее изображение

private class TouchImageViewListener implements OnTouchListener { 

    // 
    // Remember last point position for dragging 
    // 
    private PointF last = new PointF(); 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     mScaleDetector.onTouchEvent(event); 
     mGestureDetector.onTouchEvent(event); 
     PointF curr = new PointF(event.getX(), event.getY()); 

     if (state == NONE || state == DRAG || state == FLING) { 
      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       last.set(curr); 
       if (fling != null) 
        fling.cancelFling(); 
       setState(DRAG); 
        //Modified Portion 

      getParent().requestDisallowInterceptTouchEvent(true); 
       break; 

      case MotionEvent.ACTION_MOVE: 
       if (state == DRAG) { 
        float deltaX = curr.x - last.x; 
        float deltaY = curr.y - last.y; 
        float fixTransX = getFixDragTrans(deltaX, viewWidth, 
          getImageWidth()); 
        float fixTransY = getFixDragTrans(deltaY, viewHeight, 
          getImageHeight()); 
        matrix.postTranslate(fixTransX, fixTransY); 
        if (deltaX == 0 || normalizedScale == 1.0) 
        //Modified Portion 

      getParent().requestDisallowInterceptTouchEvent(false) 
        else 
           getParent().requestDisallowInterceptTouchEvent(true); 
        fixTrans(); 
        last.set(curr.x, curr.y); 
       } 
       break; 

      case MotionEvent.ACTION_UP: 
      //Modified Portion 

       getParent().requestDisallowInterceptTouchEvent(false) 

       break; 
      case MotionEvent.ACTION_POINTER_UP: 
       setState(NONE); 
       break; 
      } 
     } 

     setImageMatrix(matrix); 
     // 
     // indicate event was handled 
     // 
     return true; 
    } 
}//requestDisallowInterceptTouchEvent is Added When Touch Lister Occurs While Zoomed In 

....... 
private class GestureListener extends 
     GestureDetector.SimpleOnGestureListener { 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) { 
     return performClick(); 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     performLongClick(); 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     if (fling != null) { 
      // 
      // If a previous fling is still active, it should be cancelled 
      // so that two flings 
      // are not run simultaenously. 
      // 
      fling.cancelFling(); 
     } 
     fling = new Fling((int) velocityX, (int) velocityY); 
     compatPostOnAnimation(fling); 
     return super.onFling(e1, e2, velocityX, velocityY); 
    } 

    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     boolean consumed = false; 

//Modified Portion 
     if (state == NONE) { 
      float targetZoom = (normalizedScale == minScale) ? maxScale 
        : minScale; 
      DoubleTapZoom doubleTap = new DoubleTapZoom(targetZoom, 
        e.getX(), e.getY(), false); 
      compatPostOnAnimation(doubleTap); 
      consumed = true; 
     } 
     else 
     { 
      float targetZoom = (normalizedScale == minScale) ? maxScale 
        : minScale; 
      DoubleTapZoom doubleTap = new DoubleTapZoom(targetZoom, 
        e.getX(), e.getY(), false); 
      compatPostOnAnimation(doubleTap); 
     } 
     return consumed; 
    } 
}//Allow User To Double Tap To Orginal Position So that only he can Swipe to next image 

Скачать TouchImageView из Here И модифицирует вышеуказанные Порции

FullScreenImageAdapter.java

package com.example.gallery; 



public class FullScreenImageAdapter extends PagerAdapter { 

private Activity _activity; 
private String[] mStrings; 
private LayoutInflater inflater; 
ImageLoader im; 


// constructor 
public FullScreenImageAdapter(Activity activity, String[] mStrings) { 
    this._activity = activity; 
    this.mStrings = mStrings; 

    im = new ImageLoader(_activity); 
} 

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

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

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    TouchImageView imgDisplay; 
    final Button btnClose; 

    inflater = (LayoutInflater) _activity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, 
      container, false); 
    RelativeLayout parentview = (RelativeLayout) viewLayout 
      .findViewById(R.id.rel); 
    imgDisplay = (TouchImageView) viewLayout.findViewById(R.id.imgDisplay); 
    btnClose = (Button) viewLayout.findViewById(R.id.btnClose); 

    im.DisplayImage(mStrings[position], imgDisplay); 

    // close button click event 
    btnClose.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      _activity.finish(); 
     } 
    }); 

    ((ViewPager) container).addView(viewLayout); 
    /** 
    * Setting the object for animation 
    * */ 


    return viewLayout; 
} 

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

} 

}

MainActivity.java

package com.example.gallery; 





public class MainActivity extends Activity { 

private FullScreenImageAdapter adapter; 
private MyViewPager viewPager; 
private String[] mStrings = { 
     "http://3rdbillion.net/wp-content/uploads/2013/12/9039b649b7cd0ee7f418e55416a8ea204.jpg", 
      "http://images.tentebranda.org/wp-content/uploads/animal-images_5514_1.jpg", 
      "http://3rdbillion.net/wp-content/uploads/2013/12/f6aa5d04531f8ff9416ace6e273405304.jpg", 
      "http://3rdbillion.net/wp-content/uploads/2013/12/fcbc6aaa7ccd1ebaea80f36bfad3c8f74.jpg"}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_fullscreen_view); 

    viewPager = (MyViewPager) findViewById(R.id.pager); 



    adapter = new FullScreenImageAdapter(MainActivitys.this, mStrings); 


    viewPager.setAdapter(adapter); 
    viewPager.setPageMargin(30); 
    // displaying selected image first 
    viewPager.setCurrentItem(position); 
} 
} 

Изображения отображаются используя ленивые Загруженные из Web В этом примере я использую LAzyLoad library

Пожалуйста Скачать и добавить к вашему проекту

И наконец, файлы Xml

layout_fullscreen_image.xml

<?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" 
android:id="@+id/rel" > 

<!-- <YourPackagename where TouchImageView.java is Placed.TouchImageView 
    android:id="@+id/imgDisplay" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:scaleType="fitCenter" />Example is given below My TouchImageView.java is placed in the com.example.gallery package 
--> 

    <com.example.gallery.TouchImageView 
    android:id="@+id/imgDisplay" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:scaleType="fitCenter" /> 

<Button 
    android:id="@+id/btnClose" 
    android:layout_width="wrap_content" 
    android:layout_height="30dp" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginRight="15dp" 
    android:layout_marginTop="15dp" 
    android:paddingTop="2dp" 
    android:paddingBottom="2dp" 
    android:background="@drawable/ic_launcher" 
    android:textColor="#ffffff" 
    android:paddingLeft="10dp" 
    android:paddingRight="10dp" 
    android:text="Close" /> 

activity_fullscreen_view

<?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="#33BBFFFF" > 
<!--<YourPackagename where MyViewPager.java is Placed.MyViewPager 
    android:id="@+id/pager" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" />Example is given below My MyViewPager.java is placed in the com.example.gallery package--> 

<com.example.gallery.MyViewPager 
    android:id="@+id/pager" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

</LinearLayout> 

Также Добавить Интернет-разрешение и разрешение на запись для хранения в файле манифеста Затем Вы Done

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

Для показа изображений с карты памяти Sd Замените только часть ленивой загрузки и добавьте необходимые файлы для отображения изображений с карты Sd и установите Adpator

----------------- Обновление-- ---

новая ссылка для TouchImageview является here

1

Поскольку все ответы в этой теме довольно старые я вывешу результаты моего исследования здесь. Я наконец нашел библиотеку Subsampling Scale Image View, и она работает со стандартным ViewPager из Android Support Package без каких-либо настроек. Это стоит попробовать.

+0

Чрезмерное продвижение определенного продукта/ресурса может восприниматься сообществом как ** спам **. Взгляните на [помощь], особенно [Какое поведение ожидается от пользователей?] (Http://stackoverflow.com/help/behavior) в последнем разделе: _Убедитесь явной саморекламы. Вы также можете быть заинтересованы в [Как разместить рекламу в переполнении стека?] (Http://stackoverflow.com/help/advertising). Вы уже упомянули этот продукт [здесь] (http: // stackoverflow.com/a/36654256/1743880) и [здесь] (http://stackoverflow.com/a/36654230/1743880) – Tunaki

+0

@Tunaki библиотека, о которой я упоминал, не является моей библиотекой. У меня нет никакого отношения к его авторам или что-то в этом роде. Я даже не участвовал в этой библиотеке. И я не заинтересован в его продвижении, кроме помощи другим людям, чтобы найти его и решить их проблему. Потому что я потратил несколько часов на попытку библиотек, упомянутых выше. И особенно потому, что принятые ответы говорят о том, что лучшей библиотекой для масштабирования изображений является TouchImageView, но на самом деле это не фактическая информация. – lobzik

+0

Достаточно честный, но вы должны попытаться улучшить свой ответ, включив пример его использования. Кроме того, вы опубликовали 2 других ответа, таких как этот: если вопросы повторяются, вы должны проголосовать за закрытие как таковое. – Tunaki

Смежные вопросы