English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
DragImageView trascina giù per ingrandire l'immagine, prima l'immagine:
La classe principale: hereda di RelativeLayout, aggiunge ImageView all'interno di RelativeLayout e cambia la scala di ImageView tramite eventi di tocco. Calcola la scala durante lo spostamento del dito verso il basso dello schermo, in modo che la parte inferiore dell'immagine arrivi esattamente alla parte inferiore dello schermo. Quando rilasci il dito, l'immagine ritorna gradualmente.
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; /** 是否处在回弹状态 */ private boolean isBacking = false; /** 用于记录拖拉图片移动的坐标位置 */ private Matrix matrix = new Matrix(); /** 用于记录图片要进行拖拉时候的坐标位置 */ private Matrix currentMatrix = new Matrix(); private Matrix defaultMatrix = new Matrix(); /** 图片的宽高 */ private float imgHeight, imgWidth; /** 初始状态 */ private int mode = 0; /** 拖拉照片模式 */ private final int MODE_DRAG = 1; private float scaleY = 0; /** 用于记录开始时候的坐标位置 */ private PointF startPoint = new PointF(); /** Utilizzato per registrare la posizione Y iniziale in tutto lo schermo */ 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 Costruttore generato automaticamente this.mContext = context; this.attrs = attrs; initView(); } public DragScaleImageView(Context context) { super(context); // TODO Costruttore generato automaticamente this.mContext = context; initView(); } public DragScaleImageView(Activity activity, Bitmap resBitmap, int width, int height) { super(activity); } /** * Inizializza l'immagine */ private void initView() { /* Ottiene la risoluzione della schermata */ 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); } /** * Imposta le dimensioni altezza e larghezza dell'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()); // Quando questo View è posizionato all'interno di ScrollView, può confliggere con gli eventi Touch del padre, quindi quando si tocca l'area di questo controllo, il padre non è disponibile if (event.getAction() == MotionEvent.ACTION_UP) { getParent().requestDisallowInterceptTouchEvent(false); } else { getParent().requestDisallowInterceptTouchEvent(true);// true indica che il padre non è disponibile; } switch (event.getAction() & MotionEvent.ACTION_MASK) { // Il dito preme sulla schermata 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; // Registrare la posizione attuale di ImageView currentMatrix.set(imageView.getImageMatrix()); startPoint.set(event.getX(), event.getY()); startRawY = event.getRawY(); Log.w(TAG, "onTouchEvent startRawY:" + startRawY); } break; // Il dito si muove sulla schermata, questo evento verrà attivato ripetutamente case MotionEvent.ACTION_MOVE: // Trascinare l'immagine if (mode == MODE_DRAG) { // float dx = event.getX() - startPoint.x; // Ottenere la distanza di movimento dell'asse x float dy = event.getY() - startPoint.y; // Ottenere la distanza di movimento dell'asse y // Muoversi alla posizione prima del movimento senza spostamento if (dy > 0) { matrix.set(currentMatrix); Log.w(TAG, "onTouchEvent dy:" + dy); scale = ((dy / (displayHeight - startRawY) * (displayHeight - imgHeight)) + imgHeight) / imgHeight; // Ottenere il fattore di ingrandimento, quando il dito si muove alla parte inferiore dello schermo, l'immagine raggiunge anche la parte inferiore dello schermo 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; // Il dito lascia lo schermo case MotionEvent.ACTION_UP: // Quando il punto di contatto lascia lo schermo, l'immagine viene ripristinata mHandler.sendEmptyMessage(BACK_SCALE); case MotionEvent.ACTION_POINTER_UP: // Quando due dita si muovono, annullare lo spostamento dell'immagine mode = 0; break; } // Impostazione dell'evento di ascolto del tocco if (touchEventListener != null) { touchEventListener.onTouchEvent(event); } return true; } /** Recupero progressivo */ @SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO metodo stub generato automaticamente switch (msg.what) { case BACK_SCALE: scale = (scaleY / 2 + imgHeight) / (imgHeight); // Ottenere il fattore di ingrandimento 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); // Gradualmente ripristina } 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; } /** Touch事件监听 */ public interface TouchEventListener { public void onTouchEvent(MotionEvent event); } /** 回弹事件监听 */ public interface BackScaleListener { public void onBackScale(); } }
调用的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); /** Imposta le dimensioni personalizzate dell'ImageView, se non impostate, riduce le dimensioni dell'immagine alla larghezza dello schermo */ // mDragScaleImageView.setImageWidthAndHeight(720, 300); // ascoltatore di eventi Touch mDragScaleImageView.setTouchEventListener(new TouchEventListener() { @Override public void onTouchEvent(MotionEvent event) { // TODO metodo stub generato automaticamente // fare qualcosa qui } }); // ascoltatore di eventi di rimbalzo mDragScaleImageView.setBackScaleListener(new BackScaleListener() { @Override public void onBackScale() { // TODO metodo stub generato automaticamente // fare qualcosa qui } }); } }
file di layout 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>
Download:Codice sorgente
Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento e che tu sostenga fortemente il tutorial di urla.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright spetta ai rispettivi autori, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente i contenuti sospetti di violazione del copyright.