誰かが私が構築しようとしているmapviewimに関するいくつかのことを手伝ってくれませんか。キャンバスを取得してビットマップを描画するレンダラーがあります。ビューを作成し、コンストラクターで次を作成します。
bitmap = Bitmap.createBitmap(windowWidth, windowHeight, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
drawable = new BitmapDrawable(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
this.Render();
onDrawメソッドで私はこれを持っています:
super.onDraw(canvas);
canvas.save();
canvas.translate(mPosX, mPosY);
canvas.scale(mScaleFactor, mScaleFactor);
drawable.draw(canvas);
canvas.restore();
今、私はパンとズームを実装したいと思います(現在、保存されたタイルなしで動作しています)これが私のonTouchです:
mScaleDetector.onTouchEvent(ev);
final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
this.hasPanned = false;
final float x = ev.getX();
final float y = ev.getY();
mLastTouchX = x;
mLastTouchY = y;
mActivePointerId = ev.getPointerId(0);
break;
}
case MotionEvent.ACTION_MOVE: {
final int pointerIndex = ev.findPointerIndex(mActivePointerId);
final float x = ev.getX(pointerIndex);
final float y = ev.getY(pointerIndex);
if (!mScaleDetector.isInProgress()) {
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
mPosX += dx;
mPosY += dy;
invalidate();
}
mLastTouchX = x;
mLastTouchY = y;
break;
}
case MotionEvent.ACTION_UP: {
mActivePointerId = INVALID_POINTER_ID;
if (this.mDownTouchX != this.mLastTouchX && this.mDownTouchY != mLastTouchY)
this.hasPanned = true;
break;
}
case MotionEvent.ACTION_CANCEL: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_POINTER_UP: {
final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
>> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = ev.getPointerId(pointerIndex);
if (pointerId == mActivePointerId) {
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mLastTouchX = ev.getX(newPointerIndex);
mLastTouchY = ev.getY(newPointerIndex);
mActivePointerId = ev.getPointerId(newPointerIndex);
}
break;
}
}
return true;
これが私が望むものと私が抱えている問題です:
- パンするとき、距離をピクセル単位で計算したいので、レンダラーが画像を再度レンダリングするときにそれを伝えることができます。これはどのように達成されますか?ACTION_DOWNの座標を記憶し、ACTION_UPの新しい座標と比較することによって?
- パンが完了したら(そして画像が再レンダリングされたら)、キャンバス(画像)を元の位置に戻したいと思います。現在、ペインのままです(canvas.translateのため?)
- ズームジェスチャを処理するにはどうすればよいですか?このコードを使用すると、指でズームアウトすると、画像が左上隅に向かって「ドラッグ」されます...
私はアンドロイド(およびジャバ)で新しいので、どんな助けも高く評価されます。