English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Android DragImageView Implementierung des Pull-and-Zoom von Bildern

DragImageView nach unten ziehen und das Bild vergrößern, erstes Bild oben:

Hauptklasse: Erbt von RelativeLayout und fügt in RelativeLayout ImageView hinzu. Ändert die Skalierung von ImageView über Touch-Ereignisse, berechnet währenddessen die Skalierung, sodass das Bildboden genau am unteren Bildschirmrand ankommt, wenn der Finger am unteren Bildschirmrand ist, und das Bild schrittweise zurückprallt, wenn der Finger losgelassen wird.

package com.example.dragimagescale; 
import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.graphics.PointF; 
import android.os.Handler; 
import android.os.Message; 
import android.util.AttributeSet; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.WindowManager; 
import android.widget.ImageView; 
import android.widget.ImageView.ScaleType; 
import android.widget.RelativeLayout; 
public class DragScaleImageView extends RelativeLayout { 
 private String TAG = "DragScaleImageView"; 
 private static final int BACK_SCALE = 1010; 
 private Context mContext; 
 private AttributeSet attrs; 
 private int displayWidth = 0; 
 private int displayHeight = 0; 
 private int mImageId; 
 private Bitmap bmp; 
 private ImageView imageView; 
 /** Obereinanderliegen Sie im Rückprallzustand? */ 
 private boolean isBacking = false; 
 /** Um die Koordinate des Verschiebens des Bildes zu speichern */ 
 private Matrix matrix = new Matrix(); 
 /** Um die Koordinate zu speichern, wenn das Bild verschoben werden soll */ 
 private Matrix currentMatrix = new Matrix(); 
 private Matrix defaultMatrix = new Matrix(); 
 /** Bildbreite und -höhe */ 
 private float imgHeight, imgWidth; 
 /** Initialzustand */ 
 private int mode = 0; 
 /** Modus zum Verschieben von Bildern */ 
 private final int MODE_DRAG = 1; 
 private float scaleY = 0; 
 /** Um die Koordinate zum Zeitpunkt des Beginns zu speichern */ 
 private PointF startPoint = new PointF(); 
 /** Um die Y-Koordinate im gesamten Bildschirm zum Zeitpunkt des Beginns zu speichern */ 
 private float startRawY = 0; 
 float scale = 1; 
 private TouchEventListener touchEventListener = null; 
 private BackScaleListener backScaleListener = null; 
 public DragScaleImageView(Context context, AttributeSet attrs) { 
  super(context, attrs); 
  // TODO Auto-generierter Konstruktorstummel 
  this.mContext = context; 
  this.attrs = attrs; 
  initView(); 
 } 
 public DragScaleImageView(Context context) { 
  super(context); 
  // TODO Auto-generierter Konstruktorstummel 
  this.mContext = context; 
  initView(); 
 } 
 public DragScaleImageView(Activity activity, Bitmap resBitmap, int width, 
   int height) { 
  super(activity); 
 } 
 /** 
  * Initialisieren Sie das Bild 
  */ 
 private void initView() { 
  /* Erhalten Sie die Bildschirmauflösung */ 
  DisplayMetrics dm = new DisplayMetrics(); 
  WindowManager mWm = (WindowManager) mContext 
    .getSystemService(Context.WINDOW_SERVICE); 
  mWm.getDefaultDisplay().getMetrics(dm); 
  displayWidth = dm.widthPixels; 
  displayHeight = dm.heightPixels; 
  TypedArray a = mContext.obtainStyledAttributes(attrs, 
    R.styleable.DragScaleImageView); 
  mImageId = a.getResourceId(R.styleable.DragScaleImageView_scale_image, 
    0); 
  a.recycle(); 
  if (null == bmp && mImageId != 0) { 
   bmp = BitmapFactory.decodeResource(getResources(), mImageId); 
   float scale = (float) displayWidth / (float) bmp.getWidth();// 1080/1800 
   matrix.postScale(scale, scale, 0, 0); 
   imgHeight = scale; * bmp.getHeight(); 
   imgWidth = scale; * bmp.getWidth(); 
  } else { 
   imgHeight = displayWidth; 
   imgWidth = displayWidth; 
  } 
  initImageView(); 
 } 
 private void initImageView() { 
  imageView = new ImageView(mContext); 
  imageView.setImageMatrix(matrix); 
  defaultMatrix.set(matrix); 
  Log.w(TAG, "imgWidth :" + imgWidth); 
  Log.w(TAG, "imgHeight :" + imgHeight); 
  RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( 
    (int) imgWidth, (int) imgHeight); 
  imageView.setLayoutParams(layoutParams); 
  imageView.setImageBitmap(bmp); 
  imageView.setScaleType(ScaleType.CENTER_CROP); 
  this.addView(imageView); 
 } 
 /** 
  * 设置ImageView的宽高 
  * 
  * @param width 
  * @param height 
  */ 
 public void setImageWidthAndHeight(int width, int height) { 
  imgWidth = width; 
  imgHeight = height; 
  RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( 
    (int) imgWidth, (int) imgHeight); 
  imageView.setLayoutParams(layoutParams); 
 } 
 public boolean onTouchEvent(MotionEvent event) { 
  Log.w(TAG, "onTouchEvent :" + event.getAction()); 
  // 当该View放置在ScrollView里面时,会与父控件Touch事件冲突,所以touch该控件区域时,父控件不可用 
  if (event.getAction() == MotionEvent.ACTION_UP) { 
   getParent().requestDisallowInterceptTouchEvent(false); 
  } else { 
   getParent().requestDisallowInterceptTouchEvent(true);// true表示父类的不可用; 
  } 
  switch (event.getAction() & MotionEvent.ACTION_MASK) { 
  // 手指压下屏幕 
  case MotionEvent.ACTION_DOWN: 
   if (isBacking) { 
    return super.onTouchEvent(event); 
   } 
   int[] location = new int[2]; 
   imageView.getLocationInWindow(location); 
   if (location[1}] >= 0) { 
    mode = MODE_DRAG; 
    // 记录ImageView当前的移动位置 
    currentMatrix.set(imageView.getImageMatrix()); 
    startPoint.set(event.getX(), event.getY()); 
    startRawY = event.getRawY(); 
    Log.w(TAG, "onTouchEvent startRawY:" + startRawY); 
   } 
   break; 
  // Wenn der Finger auf dem Bildschirm bewegt wird, wird dieses Ereignis ständig ausgelöst 
  fall MotionEvent.ACTION_MOVE: 
   // ziehen Sie das Bild 
   if (mode == MODE_DRAG) { 
//    float dx = event.getX() - startPoint.x; // erhalten Sie den Verschiebungsabstand der x-Achse 
    float dy = event.getY() - startPoint.y; // erhalten Sie den Verschiebungsabstand der y-Achse 
    // bewegen Sie sich an der Position, bevor Sie bewegt haben 
    if (dy > 0) { 
     matrix.set(currentMatrix); 
     Log.w(TAG, "onTouchEvent dy:" + dy); 
     scale = ((dy / (displayHeight - startRawY) * (displayHeight - imgHeight)) + imgHeight) 
       / imgHeight; // erhalten Sie das Skalierungsfaktor, wenn der Finger nach unten bewegt wird, das Bild erreicht auch den unteren Bildschirmrand 
     Log.w(TAG, "onTouchEvent scale:" + scale); 
     scaleY = dy; 
     RelativeLayout.LayoutParams relativeLayout = new RelativeLayout.LayoutParams( 
       (int) (scale * imgWidth), (int) (scale * imgHeight)); 
     imageView.setLayoutParams(relativeLayout); 
     matrix.postScale(scale, scale, imgWidth / 2, 0); 
     imageView.setImageMatrix(matrix); 
    } 
   } 
   break; 
  // Der Finger verlässt den Bildschirm 
  fall MotionEvent.ACTION_UP: 
   // Wenn der Berührungspunkt das Bildschirm verlässt, wird das Bild wiederhergestellt 
   mHandler.sendEmptyMessage(BACK_SCALE); 
  fall MotionEvent.ACTION_POINTER_UP: 
   // Wenn zwei Finger bewegt werden, das Verschieben des Bildes aufheben 
   mode = 0; 
   break; 
  } 
  // vorgestellte Touch-Abhörereignisse 
  if (touchEventListener != null) { 
   touchEventListener.onTouchEvent(event); 
  } 
  return true; 
 } 
 /** Schrittweise Rückskalierung */ 
 @SuppressLint("HandlerLeak") 
 private Handler mHandler = new Handler() { 
  @Override 
  public void handleMessage(Message msg) { 
   // TODO Auto-generierter Methodenstub 
   switch (msg.what) { 
   fallBACK_SCALE: 
    scale = (scaleY / 2 + imgHeight) / (imgHeight);// erhalten Sie das Skalierungsfaktor 
    if (scaleY > 0) { 
     isBacking = true; 
     matrix.set(currentMatrix); 
     RelativeLayout.LayoutParams relativeLayout = new RelativeLayout.LayoutParams( 
       (int) (scale * imgWidth), (int) (scale * imgHeight)); 
     imageView.setLayoutParams(relativeLayout); 
     matrix.postScale(scale, scale, imgWidth / 2, 0); 
     imageView.setImageMatrix(matrix); 
     scaleY = (float) (scaleY / 2 - 1); 
     mHandler.sendEmptyMessageDelayed(BACK_SCALE, 20);// Schrittweise Rückskalierung 
    } else { 
     scaleY = 0; 
     RelativeLayout.LayoutParams relativeLayout = new RelativeLayout.LayoutParams( 
       (int) imgWidth, (int) imgHeight); 
     imageView.setLayoutParams(relativeLayout); 
     matrix.set(defaultMatrix); 
     imageView.setImageMatrix(matrix); 
     isRückskalieren = false; 
    } 
    if (rückskalierenHörer != null) { 
     rückskalierenHörer.aufRückskalieren(); 
    } 
    break; 
   default: 
    break; 
   } 
   super.handleMessage(msg); 
  } 
 }; 
 public void setBerührungEreignisHörer(BerührungEreignisHörer berührungEreignisHörer) { 
  this.berührungEreignisHörer = berührungEreignisHörer; 
 } 
 public void setRückskalierenHörer(RückskalierenHörer rückskalierenHörer) { 
  this.rückskalierenHörer = rückskalierenHörer; 
 } 
 /** Touch-Event-Abhörer */ 
 public interface BerührungEreignisHörer { 
  public void aufBerührungEreignis(BerührungEreignis ereignis); 
 } 
 /** Rücksetzevent-Abhörer */ 
 public interface RückskalierenHörer { 
  public void aufRückskalieren(); 
 } 
} 

aufgerufene Activity:

package com.example.dragimagescale; 
import com.example.dragimagescale.DragScaleImageView.BackScaleListener; 
import com.example.dragimagescale.DragScaleImageView.TouchEventListener; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
public class MainActivity extends Activity { 
 DragScaleImageView mDragScaleImageView; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  mDragScaleImageView = (DragScaleImageView) findViewById(R.id.dragScaleImageView); 
  /** Definiere die Breite und Höhe des benutzerdefinierten ImageView, falls nicht eingestellt, wird auf die Breite und Höhe des Bildes komprimiert, bis zur Bildschirmbreite */ 
//  mDragScaleImageView.setImageWidthAndHeight(720, 300); 
  // Touch-Event-Abhörer 
  mDragScaleImageView.setTouchEventListener(new TouchEventListener() { 
   @Override 
   public void onTouchEvent(MotionEvent event) { 
    // TODO Auto-generierter Methodenstub 
    // hier etwas tun 
   } 
  ); 
  // Rücksetzevent-Abhörer 
  mDragScaleImageView.setBackScaleListener(new BackScaleListener() { 
   @Override 
   public void onBackScale() { 
    // TODO Auto-generierter Methodenstub 
    // hier etwas tun 
   } 
  ); 
 } 
} 

XML-Layout-Datei:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android 
 xmlns:tools="http://schemas.android.com/tools 
 xmlns:dragscaleimageview="http://schemas.android.com/apk/res/com.example.dragimagescale" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:background="#ffffff" > 
 <com.example.dragimagescale.DragScaleImageView 
  android:id="@"+id/dragScaleImageView" 
  android:layout_width="match_parent"   
  android:layout_height="wrap_content" 
  dragscaleimageview:scale_image="@drawable/image" 
  > 
 </com.example.dragimagescale.DragScaleImageView> 
</RelativeLayout> 

Herunterladen:Quellcode

Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und dass Sie die Anleitungshilfe stark unterstützen.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet bezogen und gehört dem Urheber. Der Inhalt wurde von Internetbenutzern selbstständig bereitgestellt und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Sie übernimmt keine rechtlichen Verantwortlichkeiten. Wenn Sie urheberrechtlich geschützte Inhalte entdecken, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3Anzeige: Bitte ersetzen Sie # durch @ beim Senden von E-Mails, um eine Beschwerde zu melden, und fügen Sie relevante Beweise bei. Sobald nachgewiesen, wird diese Website den beschuldigten urheberrechtlichen Inhalt sofort löschen.

Vielleicht gefällt Ihnen