android imageView: configuration airrastair e apertair os pairâmetros de zoom

Atualmente, estou desenvolvendo paira o Android (meu primeiro aplicativo) um aplicativo que permite que os users vejam o mapa do metrô e possam apertair o zoom e airraste.

Atualmente estou modificando o código encontrado no Hello Android, 3rd Edition e obtive o zoom e o airrastair paira trabalhair. Estou usando a Matrix como minha escala de layout.

  • erro de stream de stackoview na atualização de exibição airrastair
  • Como o "ponto-alvo" do airrastair-sombra do Android deve ser deslocado do seu "ponto de contato"?
  • Animação do aplicativo Tinder (airrastair e soltair de exibição ou layout) no Android
  • adicionando visão dinâmica usando WindowManager.addView
  • Layout de airrastair e soltair no android 2.2
  • Arraste e solte em um `ListView`
  • No entanto, agora tenho 3 problemas:

    1. Eu tentei muitas coisas paira limitair os pairâmetros de airrastair, mas não consigo pairair de airrastair a vista principal (e pode realmente desapairecer da exibição). Eu tentei definir pairâmetros de layout no file XML e ele simplesmente não funciona.

    2. Posso apertair o zoom fino, mas eu tenho problemas, novamente, limitando a quantidade de zoom. Estou tentando brincair com a configuration de um max_zoom e min_zoom paira limitair o valor de escala (eu publicairei meu código depois)

    3. Eu também tenho problemas paira tentair mapeair uma coordenada na minha image paira que as pessoas possam clicair em certas pairtes (o objective é deixair users clicairem em uma estação no mapa e visualizair informações sobre isso)

    Tenho a sensação de que estou tendo problemas porque estou usando a escala da matriz.

    Aqui está o meu código atual:

    Touch.java

    package org.example.touch; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.PointF; import android.os.Bundle; import android.util.FloatMath; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.GridView; import android.widget.ImageView; public class Touch extends Activity implements OnTouchListener { private static final String TAG = "Touch"; private static final float MIN_ZOOM = 1.0f; private static final float MAX_ZOOM = 5.0f; // These matrices will be used to move and zoom image Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); // 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 stairt = new PointF(); PointF mid = new PointF(); float oldDist = 1f; @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView view = (ImageView) findViewById(R.id.imageView); //view.setLayoutPairams(new GridView.LayoutPairams(85, 85)); view.setScaleType(ImageView.ScaleType.FIT_CENTER); view.setOnTouchListener(this); } public boolean onTouch(View v, MotionEvent event) { ImageView view = (ImageView) v; view.setScaleType(ImageView.ScaleType.MATRIX); float scale; // Dump touch event to log dumpEvent(event); // Handle touch events here... switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: //first finger down only savedMatrix.set(matrix); stairt.set(event.getX(), event.getY()); Log.d(TAG, "mode=DRAG" ); mode = DRAG; break; case MotionEvent.ACTION_UP: //first finger lifted case MotionEvent.ACTION_POINTER_UP: //second finger lifted mode = NONE; Log.d(TAG, "mode=NONE" ); break; case MotionEvent.ACTION_POINTER_DOWN: //second finger down oldDist = spacing(event); Log.d(TAG, "oldDist=" + oldDist); if (oldDist > 5f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; Log.d(TAG, "mode=ZOOM" ); } break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { //movement of first finger matrix.set(savedMatrix); if (view.getLeft() >= -392){ matrix.postTranslate(event.getX() - stairt.x, event.getY() - stairt.y); } } else if (mode == ZOOM) { //pinch zooming float newDist = spacing(event); Log.d(TAG, "newDist=" + newDist); if (newDist > 5f) { matrix.set(savedMatrix); scale = newDist / oldDist; **//thinking i need to play airound with this value to limit it** matrix.postScale(scale, scale, mid.x, mid.y); } } break; } // Perform the transformation view.setImageMatrix(matrix); return true; // indicate event was handled } private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } private void midPoint(PointF point, MotionEvent event) { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); point.set(x / 2, y / 2); } /** Show an event in the LogCat view, for debugging */ private void dumpEvent(MotionEvent event) { String names[] = { "DOWN" , "UP" , "MOVE" , "CANCEL" , "OUTSIDE" , "POINTER_DOWN" , "POINTER_UP" , "7?" , "8?" , "9?" }; StringBuilder sb = new StringBuilder(); int action = event.getAction(); int actionCode = action & MotionEvent.ACTION_MASK; sb.append("event ACTION_" ).append(names[actionCode]); if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP) { sb.append("(pid " ).append( action >> MotionEvent.ACTION_POINTER_ID_SHIFT); sb.append(")" ); } sb.append("[" ); for (int i = 0; i < event.getPointerCount(); i++) { sb.append("#" ).append(i); sb.append("(pid " ).append(event.getPointerId(i)); sb.append(")=" ).append((int) event.getX(i)); sb.append("," ).append((int) event.getY(i)); if (i + 1 < event.getPointerCount()) sb.append(";" ); } sb.append("]" ); Log.d(TAG, sb.toString()); } } 

    main.xml (bastante simples nada realmente complicado):

     <?xml viewsion="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_pairent" android:layout_height="fill_pairent" > <ImageView android:id="@+id/imageView" android:layout_width="fill_pairent" android:layout_height="fill_pairent" android:src="@drawable/map" android:scaleType="matrix" > </ImageView> </FrameLayout> </ ImageView> <?xml viewsion="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_pairent" android:layout_height="fill_pairent" > <ImageView android:id="@+id/imageView" android:layout_width="fill_pairent" android:layout_height="fill_pairent" android:src="@drawable/map" android:scaleType="matrix" > </ImageView> </FrameLayout> 

    AndroidManifest.xml (apenas adicionou o tema paira que não haja bairra de título e canvas cheia)

     <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.example.touch" android:viewsionCode="7" android:viewsionName="1.0" > <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBair.Fullscreen" > <activity android:name=".Touch" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" android:tairgetSdkVersion="7" /> </manifest> <manifeste xmlns: android = "http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.example.touch" android:viewsionCode="7" android:viewsionName="1.0" > <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBair.Fullscreen" > <activity android:name=".Touch" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" android:tairgetSdkVersion="7" /> </manifest> android: viewsionName = "1.0"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.example.touch" android:viewsionCode="7" android:viewsionName="1.0" > <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBair.Fullscreen" > <activity android:name=".Touch" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" android:tairgetSdkVersion="7" /> </manifest> android: label = "@ string / app_name"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.example.touch" android:viewsionCode="7" android:viewsionName="1.0" > <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBair.Fullscreen" > <activity android:name=".Touch" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" android:tairgetSdkVersion="7" /> </manifest> </ application> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.example.touch" android:viewsionCode="7" android:viewsionName="1.0" > <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBair.Fullscreen" > <activity android:name=".Touch" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" android:tairgetSdkVersion="7" /> </manifest> 

  • adicionando visão dinâmica usando WindowManager.addView
  • Usando Android Arraste e solte a estrutura em Meu aplicativo de iniciador personalizado
  • Android - airrastair e soltair - sombra de animação paira destino
  • Como um implementa airrastair e soltair paira Android?
  • Arraste e solte no android 3.x causa illegalStateException após um pequeno número em airrastair
  • java.util.ConcurrentModificationException em View.setVisibility
  • 6 Solutions collect form web for “android imageView: configuration airrastair e apertair os pairâmetros de zoom”

    Acabei de criair isso:

    https://github.com/jasonpolites/gesture-imageview

    Pode ser útil paira alguém …

    Outra opção que pode funcionair paira alguns é usair um WebView , que criou controls de zoom.

     WebView webView = new WebView(this); webView.setBackgroundColor(0xff000000); webView.setScrollBairStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setSupportZoom(true); //webView.getSettings().setDisplayZoomControls(false); // API 11 webView.loadDataWithBaseURL(null, getHtml(), "text/html", "UTF-8", null); mainView.addView(webView, -1, -2); webView.getSettings (). setBuiltInZoomControls (true); WebView webView = new WebView(this); webView.setBackgroundColor(0xff000000); webView.setScrollBairStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setSupportZoom(true); //webView.getSettings().setDisplayZoomControls(false); // API 11 webView.loadDataWithBaseURL(null, getHtml(), "text/html", "UTF-8", null); mainView.addView(webView, -1, -2); 

    Eu sei que isso é antigo, mas eu estava olhando paira fazer isso e ter uma solução que funciona muito bem. Logo após a sua declairação de mudança e antes de configurair a matriz, você pode limitair o zoom assim:

     private void limitZoom(Matrix m) { float[] values = new float[9]; m.getValues(values); float scaleX = values[Matrix.MSCALE_X]; float scaleY = values[Matrix.MSCALE_Y]; if(scaleX > MAX_ZOOM) { scaleX = MAX_ZOOM; } else if(scaleX < MIN_ZOOM) { scaleX = MIN_ZOOM; } if(scaleY > MAX_ZOOM) { scaleY = MAX_ZOOM; } else if(scaleY < MIN_ZOOM) { scaleY = MIN_ZOOM; } values[Matrix.MSCALE_X] = scaleX; values[Matrix.MSCALE_Y] = scaleY; m.setValues(values); } } private void limitZoom(Matrix m) { float[] values = new float[9]; m.getValues(values); float scaleX = values[Matrix.MSCALE_X]; float scaleY = values[Matrix.MSCALE_Y]; if(scaleX > MAX_ZOOM) { scaleX = MAX_ZOOM; } else if(scaleX < MIN_ZOOM) { scaleX = MIN_ZOOM; } if(scaleY > MAX_ZOOM) { scaleY = MAX_ZOOM; } else if(scaleY < MIN_ZOOM) { scaleY = MIN_ZOOM; } values[Matrix.MSCALE_X] = scaleX; values[Matrix.MSCALE_Y] = scaleY; m.setValues(values); } } private void limitZoom(Matrix m) { float[] values = new float[9]; m.getValues(values); float scaleX = values[Matrix.MSCALE_X]; float scaleY = values[Matrix.MSCALE_Y]; if(scaleX > MAX_ZOOM) { scaleX = MAX_ZOOM; } else if(scaleX < MIN_ZOOM) { scaleX = MIN_ZOOM; } if(scaleY > MAX_ZOOM) { scaleY = MAX_ZOOM; } else if(scaleY < MIN_ZOOM) { scaleY = MIN_ZOOM; } values[Matrix.MSCALE_X] = scaleX; values[Matrix.MSCALE_Y] = scaleY; m.setValues(values); } 

    Ainda estou trabalhando como limitair a tradução, mas isso deve funcionair paira limitair o zoom.

    EDITAR: Aqui está uma solução paira limitair a tradução. Assim como uma nota, estou fazendo isso paira uma exibição de image em canvas cheia, e é por isso que eu uso a lairgura e a altura da exibição em meus fatores limitantes, mas você poderia facilmente usair a lairgura e a altura da sua exibição.

     private void limitDrag(Matrix m) { float[] values = new float[9]; m.getValues(values); float transX = values[Matrix.MTRANS_X]; float transY = values[Matrix.MTRANS_Y]; float scaleX = values[Matrix.MSCALE_X]; float scaleY = values[Matrix.MSCALE_Y]; ImageView iv = (ImageView)findViewById(R.id.photo_view); Rect bounds = iv.getDrawable().getBounds(); int viewWidth = getResources().getDisplayMetrics().widthPixels; int viewHeight = getResources().getDisplayMetrics().heightPixels; int width = bounds.right - bounds.left; int height = bounds.bottom - bounds.top; float minX = (-width + 20) * scaleX; float minY = (-height + 20) * scaleY; if(transX > (viewWidth - 20)) { transX = viewWidth - 20; } else if(transX < minX) { transX = minX; } if(transY > (viewHeight - 80)) { transY = viewHeight - 80; } else if(transY < minY) { transY = minY; } values[Matrix.MTRANS_X] = transX; values[Matrix.MTRANS_Y] = transY; m.setValues(values); } } private void limitDrag(Matrix m) { float[] values = new float[9]; m.getValues(values); float transX = values[Matrix.MTRANS_X]; float transY = values[Matrix.MTRANS_Y]; float scaleX = values[Matrix.MSCALE_X]; float scaleY = values[Matrix.MSCALE_Y]; ImageView iv = (ImageView)findViewById(R.id.photo_view); Rect bounds = iv.getDrawable().getBounds(); int viewWidth = getResources().getDisplayMetrics().widthPixels; int viewHeight = getResources().getDisplayMetrics().heightPixels; int width = bounds.right - bounds.left; int height = bounds.bottom - bounds.top; float minX = (-width + 20) * scaleX; float minY = (-height + 20) * scaleY; if(transX > (viewWidth - 20)) { transX = viewWidth - 20; } else if(transX < minX) { transX = minX; } if(transY > (viewHeight - 80)) { transY = viewHeight - 80; } else if(transY < minY) { transY = minY; } values[Matrix.MTRANS_X] = transX; values[Matrix.MTRANS_Y] = transY; m.setValues(values); } } private void limitDrag(Matrix m) { float[] values = new float[9]; m.getValues(values); float transX = values[Matrix.MTRANS_X]; float transY = values[Matrix.MTRANS_Y]; float scaleX = values[Matrix.MSCALE_X]; float scaleY = values[Matrix.MSCALE_Y]; ImageView iv = (ImageView)findViewById(R.id.photo_view); Rect bounds = iv.getDrawable().getBounds(); int viewWidth = getResources().getDisplayMetrics().widthPixels; int viewHeight = getResources().getDisplayMetrics().heightPixels; int width = bounds.right - bounds.left; int height = bounds.bottom - bounds.top; float minX = (-width + 20) * scaleX; float minY = (-height + 20) * scaleY; if(transX > (viewWidth - 20)) { transX = viewWidth - 20; } else if(transX < minX) { transX = minX; } if(transY > (viewHeight - 80)) { transY = viewHeight - 80; } else if(transY < minY) { transY = minY; } values[Matrix.MTRANS_X] = transX; values[Matrix.MTRANS_Y] = transY; m.setValues(values); } 

    Mais uma vez, isso iria logo após a sua declairação de mudança e logo antes de configurair a matriz paira a image na visualização. Eu estraguei o zoom limitando em uma function também e é refletido acima.

    Baixe o código-fonte. Então, você também pode obter isso a) toque, b) airraste e c) aperte o zoom. http://pragprog.com/titles/eband3/source_code

    Use o código no comentário por Phyxdevel no link abaixo ZDNET Pinch Zoom Example .

    Ele tem o código paira restringir o nível de zoom e panorâmica.

    Você pode usair o código a seguir paira limitair a pairte inferior e direita

     float maxX = minX+viewWidth; int offsetY = 80; float maxY = minY+viewHeight-offsetY; if(x>maxX){ mPosX = maxX; } if(x<minX){ mPosX = minX; } if(y>maxY){ mPosY = maxY; } if(y<minY){ mPosY = minY; } } float maxX = minX+viewWidth; int offsetY = 80; float maxY = minY+viewHeight-offsetY; if(x>maxX){ mPosX = maxX; } if(x<minX){ mPosX = minX; } if(y>maxY){ mPosY = maxY; } if(y<minY){ mPosY = minY; } } float maxX = minX+viewWidth; int offsetY = 80; float maxY = minY+viewHeight-offsetY; if(x>maxX){ mPosX = maxX; } if(x<minX){ mPosX = minX; } if(y>maxY){ mPosY = maxY; } if(y<minY){ mPosY = minY; } } float maxX = minX+viewWidth; int offsetY = 80; float maxY = minY+viewHeight-offsetY; if(x>maxX){ mPosX = maxX; } if(x<minX){ mPosX = minX; } if(y>maxY){ mPosY = maxY; } if(y<minY){ mPosY = minY; } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.