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