ビットマップの拡大縮小と移動を可能にするこの非常に便利なコードを見つけたので、アプリでこのコードを使用する方法を探していました。クラスの使用方法がよくわかりません (独学で Java コーダーを学んだので、ここでいくつかの基本が欠けている可能性があります)。私は基本的に、ギャラリーを開いて、このコードで使用できるファイルを選択できるようにしたいと考えています。これはすべて標準の ImageView で実行できますが、ImageView ではスケーリング/移動できません。
メインクラスで、 touchexampleview クラスを使用して画像を画面に配置するだけです。 touchexampleview クラスには、デフォルトの画像をロードする行が含まれています。
mIcon = context.getResources().getDrawable(R.drawable.ic_launcher);
クラスでこれを変更する方法を考え出すことができましたが、これを動的に実行してユーザー主導にしたいと考えています。
メインクラスはこちら。
public class TouchExampleActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TouchExampleView view = new TouchExampleView(this);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(view);
}
}
および touchexampleview クラス
public class TouchExampleView extends View {
private Drawable mIcon;
private float mPosX;
private float mPosY;
private VersionedGestureDetector mDetector;
private float mScaleFactor = 1.f;
public TouchExampleView(Context context) {
this(context, null, 0);
}
public TouchExampleView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TouchExampleView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mIcon = context.getResources().getDrawable(R.drawable.ic_launcher);
mIcon.setBounds(0, 0, mIcon.getIntrinsicWidth(), mIcon.getIntrinsicHeight());
mDetector = VersionedGestureDetector.newInstance(context, new GestureCallback());
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
mDetector.onTouchEvent(ev);
return true;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(mPosX, mPosY);
canvas.scale(mScaleFactor, mScaleFactor);
mIcon.draw(canvas);
canvas.restore();
}
private class GestureCallback implements VersionedGestureDetector.OnGestureListener {
public void onDrag(float dx, float dy) {
mPosX += dx;
mPosY += dy;
invalidate();
}
public void onScale(float scaleFactor) {
mScaleFactor *= scaleFactor;
// Don't let the object get too small or too large.
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
invalidate();
}
}
}