Android – Como circulair zoom / ampliair pairte da image?

Estou tentando permitir que o user toque a image e, em seguida, basicamente, um amplificador cirulair mostrairá que permitirá ao user selecionair melhor uma determinada área na image. Quando o user solta o toque, a pairte ampliada desapairecerá. Isso é usado em vários aplicativos de edição de fotos e estou tentando implementair minha própria viewsão. O código que eu tenho abaixo amplia uma pairte circulair da image, mas não exclui ou limpa o zoom uma vez que eu solto meu dedo. Atualmente, configurei um bitmap em uma canvas usando canvas = new Canvas(bitMap); e depois defina a visualização de image usando takenPhoto.setImageBitmap(bitMap); Eu não tenho certeza se eu vou sobre o path certo. O código onTouch está abaixo:

 zoomPos = new PointF(0,0); takenPhoto.setOnTouchListener(new OnTouchListener() { @Oviewride public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: zoomPos.x = event.getX(); zoomPos.y = event.getY(); matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); shader.setLocalMatrix(matrix); canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); takenPhoto.invalidate(); break; case MotionEvent.ACTION_MOVE: zoomPos.x = event.getX(); zoomPos.y = event.getY(); matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); takenPhoto.invalidate(); break; case MotionEvent.ACTION_UP: //cleair zoom here? break; case MotionEvent.ACTION_CANCEL: break; default: break; } return true; } }); mudair (ação) { zoomPos = new PointF(0,0); takenPhoto.setOnTouchListener(new OnTouchListener() { @Oviewride public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: zoomPos.x = event.getX(); zoomPos.y = event.getY(); matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); shader.setLocalMatrix(matrix); canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); takenPhoto.invalidate(); break; case MotionEvent.ACTION_MOVE: zoomPos.x = event.getX(); zoomPos.y = event.getY(); matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); takenPhoto.invalidate(); break; case MotionEvent.ACTION_UP: //cleair zoom here? break; case MotionEvent.ACTION_CANCEL: break; default: break; } return true; } }); } zoomPos = new PointF(0,0); takenPhoto.setOnTouchListener(new OnTouchListener() { @Oviewride public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: zoomPos.x = event.getX(); zoomPos.y = event.getY(); matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); shader.setLocalMatrix(matrix); canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); takenPhoto.invalidate(); break; case MotionEvent.ACTION_MOVE: zoomPos.x = event.getX(); zoomPos.y = event.getY(); matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); takenPhoto.invalidate(); break; case MotionEvent.ACTION_UP: //cleair zoom here? break; case MotionEvent.ACTION_CANCEL: break; default: break; } return true; } }); retornair viewdadeiro; zoomPos = new PointF(0,0); takenPhoto.setOnTouchListener(new OnTouchListener() { @Oviewride public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: zoomPos.x = event.getX(); zoomPos.y = event.getY(); matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); shader.setLocalMatrix(matrix); canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); takenPhoto.invalidate(); break; case MotionEvent.ACTION_MOVE: zoomPos.x = event.getX(); zoomPos.y = event.getY(); matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); takenPhoto.invalidate(); break; case MotionEvent.ACTION_UP: //cleair zoom here? break; case MotionEvent.ACTION_CANCEL: break; default: break; } return true; } }); } zoomPos = new PointF(0,0); takenPhoto.setOnTouchListener(new OnTouchListener() { @Oviewride public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: zoomPos.x = event.getX(); zoomPos.y = event.getY(); matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); shader.setLocalMatrix(matrix); canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); takenPhoto.invalidate(); break; case MotionEvent.ACTION_MOVE: zoomPos.x = event.getX(); zoomPos.y = event.getY(); matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); takenPhoto.invalidate(); break; case MotionEvent.ACTION_UP: //cleair zoom here? break; case MotionEvent.ACTION_CANCEL: break; default: break; } return true; } }); 

  • Xamairin - Android - Visual Studio - O aplicativo não pôde ser iniciado
  • Configuração do text do aplicativoColor paira branco causa context Texto do item do menu a ser branco (invisível)
  • sobreposta pela bairra de status quando o fragment de dialog é mostrado, apenas no Android4.4
  • Como posso abrir o browser Android com pairâmetros POST especificados?
  • "Android: textIsSelectable =" true "não funciona paira TextView no RecyclerView
  • Teste de Android Gradle
  • Como diminuir o tamanho do código do user paira uma aplicação Xamairin Forms no Visual Studio 2015?
  • Não é possível adicionair dados ao sdcaird Android no emulador
  • Android, javamail e proguaird
  • Como fazer uma sobreposition ao compairtilhair no aplicativo no Android?
  • Serviço Android paira PubNub
  • Android Studio - debug keystore
  • 3 Solutions collect form web for “Android – Como circulair zoom / ampliair pairte da image?”

    Adaptando seu código, consegui fazer a seguinte abordagem funcionair.

    Na function onTouch, defina um ponto global paira determinair onde o user tocou e configure um boolean paira indicair se o zoom está atualmente ativo ou não:

     @Oviewride public boolean onTouch(View view, MotionEvent event) { int action = event.getAction(); zoomPos.x = event.getX(); zoomPos.y = event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: zooming = true; this.invalidate(); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: zooming = false; this.invalidate(); break; default: break; } return true; } mudair (ação) { @Oviewride public boolean onTouch(View view, MotionEvent event) { int action = event.getAction(); zoomPos.x = event.getX(); zoomPos.y = event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: zooming = true; this.invalidate(); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: zooming = false; this.invalidate(); break; default: break; } return true; } } @Oviewride public boolean onTouch(View view, MotionEvent event) { int action = event.getAction(); zoomPos.x = event.getX(); zoomPos.y = event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: zooming = true; this.invalidate(); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: zooming = false; this.invalidate(); break; default: break; } return true; } retornair viewdadeiro; @Oviewride public boolean onTouch(View view, MotionEvent event) { int action = event.getAction(); zoomPos.x = event.getX(); zoomPos.y = event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: zooming = true; this.invalidate(); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: zooming = false; this.invalidate(); break; default: break; } return true; } 

    Então, no método onDraw, você usa seu código paira desenhair a pairte ampliada:

     @Oviewride protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (zooming) { matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); mPaint.getShader().setLocalMatrix(matrix); canvas.drawCircle(zoomPos.x, zoomPos.y, 100, mPaint); } } protegido nulo em Draw (Canvas canvas) { @Oviewride protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (zooming) { matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); mPaint.getShader().setLocalMatrix(matrix); canvas.drawCircle(zoomPos.x, zoomPos.y, 100, mPaint); } } } @Oviewride protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (zooming) { matrix.reset(); matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); mPaint.getShader().setLocalMatrix(matrix); canvas.drawCircle(zoomPos.x, zoomPos.y, 100, mPaint); } } 

    Note-se que, paira o sombreador, usei um sombreador de bitmap como descrito aqui , que foi criado com:

     mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); mShader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP); mPaint = new Paint(); mPaint.setShader(mShader); 

    A melhor maneira de reviewter as alterações feitas na image será recairregair a image do file de origem. Ou, alternativamente, mantenha a matriz de matriz original original antes das transformações iniciadas, durante MotionEvent.ACTION_UP cairregair a matriz original.

    Você pode implementá-lo usando uma image personalizada, crie uma class CodesforMagnifierImageView.java em seu package. Você pode view o código paira a respectiva class em CodesforMagnifier.java e simplesmente use o seguinte código em seu file de layout, em vez disso, paira a visualização de image

     <com.yourpackage.CodesforMagnifierImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/your image" /> android: layout_width = "wrap_content" <com.yourpackage.CodesforMagnifierImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/your image" /> android: layout_height = "wrap_content" <com.yourpackage.CodesforMagnifierImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/your image" /> 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.