私は指で動かすことができ、またスケールすることができる可動の画像ビューを実装しました。私はドラッグアンドドロップのフレームワークを使用して(ドラッグ&ドロップが必要なため)、私はScaleGestureDetector.SimpleOnScaleGestureListener
にスケーリングを処理しています。 MovableImageView
は、通常のImageView
フォームをAndroidに拡張しています。ユーザーが画像ビューに触れると、メソッドonTouchEvent(MotionEvent event)が呼び出されます。このメソッドは、次のようになります。ドラッグアンドドロップとスケーリングを組み合わせる
public boolean onTouchEvent(MotionEvent event)
{
scaleDetector.onTouchEvent(event);
startDragNDrop();
return true;
}
startDragNDrop()
は次のようになります。
private void startDragNDrop() {
// Create a new ClipData.
// This is done in two steps to provide clarity. The convenience method
// ClipData.newPlainText() can create a plain text ClipData in one step.
// Create a new ClipData.Item from the ImageView object's tag
ClipData.Item item = new ClipData.Item(mediaItem.getMediaIdentifier());
// Create a new ClipData using the tag as a label, the plain text MIME type, and
// the already-created item. This will create a new ClipDescription object within the
// ClipData, and set its MIME type entry to "text/plain"
String[] mimeType = {ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData = new ClipData((CharSequence) this.getTag(),mimeType,item);
// Instantiates the drag shadow builder.
DragShadowBuilder myShadow = new ZPACDragShadowBuilder(this);
actualyDraggedView = this;
// Starts the drag
this.startDrag(dragData, // the data to be dragged
myShadow, // the drag shadow builder
null, // no need to use local data
0); // flags (not currently used, set to 0)
}
それは基本的にdragshadowを作成し、ドラッグ操作を開始します。
public boolean onScale(ScaleGestureDetector detector) {
float scaleFactor = MovableImageView.this.SCALE_FACTOR;
scaleFactor *= detector.getScaleFactor();
// Don't let the object get too small or too large.
scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 2.0f));
int width = (int) (MovableImageView.this.getWidth()*scaleFactor);
int height = (int) (MovableImageView.this.getHeight()*scaleFactor);
Log.e("MovableImageView", "Scale Gesture Captured. Scaling Factor " + scaleFactor + " old width " + MovableImageView.this.getWidth() + ", new width " + width);
AbsoluteLayout.LayoutParams layoutParams = new AbsoluteLayout.LayoutParams(width, height, MovableImageView.this.getLeft(), MovableImageView.this.getTop());
parentLayout.updateViewLayout(MovableImageView.this, layoutParams);
invalidate();
return true;
}
フィールドSCALE_FACTOR
はフロートであり、値が1.f
ある:scaleDetector.onTouchEvent(event)
は、以下になった後
onScale()の実装は、それが呼び出されます。 parentLayout
は、画面上のImageViewの位置とサイズを管理する拡張AbsoluteLayoutです。
私の問題は、スケーリングが機能せず、ドラッグアンドドロップだけです。スケーリングは実行されず、ビューを移動するだけで動作します。私がlinke startDragNDrop()
をコメントアウトすると、スケーリングは機能しますが、ビューを移動することは明らかにできません。誰かがイメージビューのものにこれらを組み合わせる方が良いアイデアはありますか?
あなたをしましたthiへの解決策を見つける?私も同様の問題があります。 – Amanni
残念ながら、いいえ。私は最終的にスケーリング機能を落とさなければならなかった。 – Dude