İçeriğinin kaydırılmasını ve yakınlaştırılmasını destekleyen bir ViewGroup oluşturmaya çalışıyorum. İnternette bulabildiğim tek şey, bir ImageView'da bunu yapmak için bir fikir ve uygulama oldu, ama asla bir konteyner. Bir haritayı görüntülemek istiyorum ve bunun üzerine ImageButtons olan çoklu işaretleyicileri görüntülemek istiyorum, böylece kullanıcı daha fazla bilgi almak için onlara dokunabilir. Bu, iOS'ta UIScrollView aracılığıyla elde edildi, ancak Android'de bir alternatif bulamadım.Yakınlaştırılabilir/kaydırılabilir bir kapsayıcı oluşturma
Bir FrameView kullanmaya karar verdim, böylece bir ImageView'i arka plan olarak görüntüye ayarlayabiliyordum ve üstüne ImageButtons'u ekleyebileceğim ve kenar boşluklarını kullanarak yerleştirebileceğim bir RelativeLayout ekleyebiliyorum.
TouchImageView here'un uygulanmasının bir kısmını ödünç aldım, ancak karmaşıklıklara girdim. Panning ile başladım ve kısmen başarılı oldum, konteynırı kaplıyor, ama panning iğrenç bir şekilde çalışıyor, çok fazla titriyor. İşte kodum:
public class ScrollingViewGroup extends FrameLayout {
private int x = 0;
private int y = 0;
// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;
// Remember some things for zooming
PointF last = new PointF();
PointF start = new PointF();
public ScrollingViewGroup(Context context) {
super(context);
sharedConstructing(context);
}
public ScrollingViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
sharedConstructing(context);
}
private void sharedConstructing(Context context) {
super.setClickable(true);
this.context = context;
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
PointF curr = new PointF(event.getX(), event.getY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
last.set(event.getX(), event.getY());
start.set(last);
mode = DRAG;
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
float deltaX = curr.x - last.x;
float deltaY = curr.y - last.y;
Log.d("ScrollingViewGroup", Float.toString(deltaX));
Log.d("ScrollingViewGroup", Float.toString(deltaY));
float scaleWidth = Math.round(origWidth * saveScale);
float scaleHeight = Math.round(origHeight * saveScale);
x += deltaX;
y += deltaY;
last.set(curr.x, curr.y);
}
break;
case MotionEvent.ACTION_UP:
mode = NONE;
int xDiff = (int) Math.abs(curr.x - start.x);
int yDiff = (int) Math.abs(curr.y - start.y);
if (xDiff < CLICK && yDiff < CLICK)
performClick();
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
}
// setImageMatrix(matrix);
setTranslationX(x);
setTranslationY(y);
invalidate();
return true; // indicate event was handled
}
});
}
Herhangi bir fikir çok takdir edilmektedir.
düzenleme: jitter neden gibi görünüyor, çünkü hareket ederken, deltaX ve deltaY pozitif ve negatif sayılar arasında değişiyor, LogCat kontrol ediliyor ... hala neden emin değilim. Bu, her seferinde farklı değerler veren curr değişkeninden kaynaklanır, ancak tutarlı olmak yerine, parmak ileriye değil, ileri geri hareket ediyormuş gibi görünürler. Örneğin, curr.x yerine, 0,1,2,3,4, vb., 0,1,0,5,2,1,5, vb. Olduğundan emin değilim.
Buna bir çözüm buldunuz mu? Ben de aynı şeyi arıyorum. – 0xSina
düğmeli bir yakınlaştırma/kaydırma yapabilen harita Hey, özür dilerim, bir süre önce şirketten ayrıldım ve kod sağlayamadım, bazı geçici çözümler buldum, ancak bunu nasıl yaptığımı hatırlayamıyorum. –