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

Implementation de l'effet d'agrandissement de l'image en glissant vers le bas dans DragImageView Android

DragImageView tire et glisse l'image pour l'agrandir, d'abord montrez l'image :

Les principales classes : héritent de RelativeLayout, puis ajoutent ImageView à l'intérieur de RelativeLayout, utilisent les événements de Touch pour modifier le zoom de l'ImageView, calculent la valeur de scale pendant le zoom, de sorte que lorsque le doigt se déplace au bas de l'écran, le bas de l'image arrive également au bas de l'écran, et lorsque le doigt est relâché, l'image rebondit progressivement.

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; 
 /** Est-ce qu'il est en état de rebondissement ? */ 
 private boolean isBacking = false; 
 /** Utilisé pour enregistrer la position de déplacement de l'image glissée-déplacée */ 
 private Matrix matrix = new Matrix(); 
 /** Utilisé pour enregistrer la position du début de l'image à glisser-déposer */ 
 private Matrix currentMatrix = new Matrix(); 
 private Matrix defaultMatrix = new Matrix(); 
 /** Largeur et hauteur de l'image */ 
 private float imgHeight, imgWidth; 
 /** État initial */ 
 private int mode = 0; 
 /** Mode de glisser-déposer d'image */ 
 private final int MODE_DRAG = 1; 
 private float scaleY = 0; 
 /** Utilisé pour enregistrer la position du début */ 
 private PointF startPoint = new PointF(); 
 /** Utilisé pour enregistrer la position Y du début dans l'écran entier */ 
 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-constructeur généré automatiquement 
  this.mContext = context; 
  this.attrs = attrs; 
  initView(); 
 } 
 public DragScaleImageView(Context context) { 
  super(context); 
  // TODO Auto-constructeur généré automatiquement 
  this.mContext = context; 
  initView(); 
 } 
 public DragScaleImageView(Activity activity, Bitmap resBitmap, int width, 
   int height) { 
  super(activity); 
 } 
 /** 
  * Initialiser l'image 
  */ 
 private void initView() { 
  /* Obtenir la résolution de l'écran */ 
  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); 
 } 
 /** 
  * Définir la largeur et la hauteur de l'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()); 
  // Lorsque ce View est placé dans un ScrollView, il peut entrer en conflit avec les événements de touche du contrôleur parent, donc le contrôleur parent n'est pas utilisable lors du toucher de la zone de ce contrôle 
  if (event.getAction() == MotionEvent.ACTION_UP) { 
   getParent().requestDisallowInterceptTouchEvent(false); 
  } else { 
   getParent().requestDisallowInterceptTouchEvent(true);// true signifie que la classe parente est inutilisable; 
  } 
  switch (event.getAction() & MotionEvent.ACTION_MASK) { 
  // l'index est appuyé sur l'écran 
  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; 
    // enregistrer la position actuelle de déplacement de l'ImageView 
    currentMatrix.set(imageView.getImageMatrix()); 
    startPoint.set(event.getX(), event.getY()); 
    startRawY = event.getRawY(); 
    Log.w(TAG, "onTouchEvent startRawY:" + startRawY); 
   } 
   break; 
  // le doigt se déplace sur l'écran, cet événement sera déclenché en continu 
  cas MotionEvent.ACTION_MOVE: 
   // trawer l'image 
   if (mode == MODE_DRAG) { 
//    float dx = event.getX() - startPoint.x; // obtenir la distance de déplacement de l'axe X 
    float dy = event.getY() - startPoint.y; // obtenir la distance de déplacement de l'axe Y 
    // déplacer à l'endroit où le doigt était sans déplacement 
    if (dy > 0) { 
     matrix.set(currentMatrix); 
     Log.w(TAG, "onTouchEvent dy:" + dy); 
     scale = ((dy / (displayHeight - startRawY) * (displayHeight - imgHeight)) + imgHeight) 
       / imgHeight; // obtenir le facteur de zoom, lorsque le doigt se déplace vers le bas de l'écran, l'image atteint également le bas de l'écran 
     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; 
  // le doigt quitte l'écran 
  cas MotionEvent.ACTION_UP: 
   // lorsque le point de contact quitte l'écran, l'image est restaurée 
   mHandler.sendEmptyMessage(BACK_SCALE); 
  cas MotionEvent.ACTION_POINTER_UP: 
   // annuler le déplacement de l'image lorsque deux doigts se déplacent 
   mode = 0; 
   break; 
  } 
  // événement de surveillance du Touch configuré 
  if (touchEventListener != null) { 
   touchEventListener.onTouchEvent(event); 
  } 
  retourner true; 
 } 
 /** progressive rebound */ 
 @SuppressLint("HandlerLeak") 
 private Handler mHandler = new Handler() { 
  @Override 
  public void handleMessage(Message msg) { 
   // TODO Auto-généré par stub de méthode 
   switch (msg.what) { 
   cas BACK_SCALE: 
    scale = (scaleY / 2 + imgHeight) / (imgHeight);// obtenir le facteur de zoom 
    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);// progressive rebound 
    } else { 
     scaleY = 0; 
     RelativeLayout.LayoutParams relativeLayout = new RelativeLayout.LayoutParams( 
       (int) imgWidth, (int) imgHeight); 
     imageView.setLayoutParams(relativeLayout); 
     matrix.set(defaultMatrix); 
     imageView.setImageMatrix(matrix); 
     isBacking = false; 
    } 
    if (backScaleListener != null) { 
     backScaleListener.onBackScale(); 
    } 
    break; 
   default: 
    break; 
   } 
   super.handleMessage(msg); 
  } 
 }; 
 public void setTouchEventListener(TouchEventListener touchEventListener) { 
  this.touchEventListener = touchEventListener; 
 } 
 public void setBackScaleListener(BackScaleListener backScaleListener) { 
  this.backScaleListener = backScaleListener; 
 } 
 /** écouteur d'événement de toucher */ 
 public interface TouchEventListener { 
  public void onTouchEvent(MotionEvent event); 
 } 
 /** écouteur d'événement de rebond */ 
 public interface BackScaleListener { 
  public void onBackScale(); 
 } 
} 

activity appelée :

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); 
  /** personnaliser la largeur et la hauteur de l'ImageView, si non configuré, il est compressé jusqu'à la largeur de l'écran en fonction de la largeur et de la hauteur de l'image */ 
//  mDragScaleImageView.setImageWidthAndHeight(720, 300); 
  // écouteur d'événement de toucher 
  mDragScaleImageView.setTouchEventListener(new TouchEventListener() { 
   @Override 
   public void onTouchEvent(MotionEvent event) { 
    // TODO Auto-généré par stub de méthode 
    // faire quelque chose ici 
   } 
  ); 
  // écouteur d'événement de rebond 
  mDragScaleImageView.setBackScaleListener(new BackScaleListener() { 
   @Override 
   public void onBackScale() { 
    // TODO Auto-généré par stub de méthode 
    // faire quelque chose ici 
   } 
  ); 
 } 
} 

Fichier de conception XML :

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

Téléchargement :Code source

Voici le contenu intégral de cet article, j'espère qu'il vous sera utile dans vos études, et j'espère que vous soutiendrez également le tutoriel d'encouragement.

Déclaration : Le contenu de cet article est extrait du réseau, la propriété intellectuelle appartient à ses auteurs respectifs, le contenu est fourni par les utilisateurs d'Internet et téléchargé spontanément, ce site Web ne possède pas de propriété, n'a pas été édité par l'homme, ni assume la responsabilité juridique pertinente. Si vous trouvez du contenu susceptible de violer les droits d'auteur, veuillez envoyer un e-mail à : notice#w3Déclaration : Le contenu de cet article est extrait du réseau, la propriété intellectuelle appartient à ses auteurs respectifs, le contenu est fourni par les utilisateurs d'Internet et téléchargé spontanément, ce site Web ne possède pas de propriété, n'a pas été édité par l'homme, ni assume la responsabilité juridique pertinente. Si vous trouvez du contenu susceptible de violer les droits d'auteur, veuillez envoyer un e-mail à : notice#w

Vous pourriez aussi aimer