Recent

Author Topic: Suggestion, improvement and expansion of "jImageView"  (Read 2831 times)

ADiV

  • Jr. Member
  • **
  • Posts: 90
    • ADiV Software
Suggestion, improvement and expansion of "jImageView"
« on: October 25, 2018, 04:59:10 pm »
Hi guys, I have improved the scaling function of "jImageView" now has a smoothing to avoid the terrible "sawtooth" effect when scaling.

Code: Java  [Select][+][-]
  1.         // Bitmap scaling with smoothing
  2.         private Bitmap GetResizedBitmap(Bitmap _bmp, int _newWidth, int _newHeight){           
  3.                
  4.                  // Get current dimensions
  5.                  int width  = _bmp.getWidth();
  6.                  int height = _bmp.getHeight();
  7.  
  8.                  // Determine how much to scale
  9.                  float xScale = ((float) _newWidth) / width;
  10.                  float yScale = ((float) _newHeight) / height;
  11.                  
  12.                 // Create a matrix for the scaling and add the scaling data
  13.                  Matrix matrix = new Matrix();
  14.                  matrix.postScale(xScale, yScale);
  15.  
  16.                  // Create a new bitmap and convert it to a format understood by the ImageView
  17.                  Bitmap scaledBitmap = Bitmap.createBitmap(_bmp, 0, 0, width, height, matrix, true);
  18.                  BitmapDrawable result = new BitmapDrawable(scaledBitmap);
  19.                  width  = scaledBitmap.getWidth();
  20.                  height = scaledBitmap.getHeight();
  21.  
  22.                  // Apply the scaled bitmap
  23.                  this.setImageDrawable(result);
  24.                  this.invalidate();
  25.                  
  26.                  Drawable drawing = this.getDrawable();
  27.                  Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
  28.                  return bitmap;
  29.                 }
  30.  

Expande the "SetImageMatrixScale" scaling function with another overloaded "SetImageMatrixScale (_scaleX: single; _scaleY: single; _centerX: single; _centerY: single);" where we can choose the scaling center:

Code: Java  [Select][+][-]
  1.         public void SetImageMatrixScale(float _scaleX, float _scaleY, float _centerX, float _centerY ) {
  2.                
  3.                 if ( this.getScaleType() != ImageView.ScaleType.MATRIX)  
  4.                         this.setScaleType(ImageView.ScaleType.MATRIX);
  5.                
  6.                 mMatrix.setScale(_scaleX, _scaleY, _centerX, _centerY);
  7.                
  8.                 this.setImageMatrix(mMatrix);          
  9.                 this.invalidate();
  10.         }
  11.  
  12.         public void SetImageMatrixScale(float _scaleX, float _scaleY ) {
  13.                
  14.                 SetImageMatrixScale( _scaleX, _scaleY, 0, 0 );
  15.         }
  16.  

It has also added events, "OnTouchDown", "OnTouchUp" and "OnTouchMove":

Code: Java  [Select][+][-]
  1.        public  boolean onTouchEvent( MotionEvent event) {
  2.                                
  3.                 int act     = event.getAction() & MotionEvent.ACTION_MASK;
  4.                 switch(act) {
  5.                         case MotionEvent.ACTION_DOWN: {
  6.                                 switch (event.getPointerCount()) {
  7.                                         case 1 : { controls.pOnTouch (PasObj,Const.TouchDown,1,
  8.                                                         event.getX(0),event.getY(0),0,0); break; }
  9.                                         default: { controls.pOnTouch (PasObj,Const.TouchDown,2,
  10.                                                         event.getX(0),event.getY(0),
  11.                                                         event.getX(1),event.getY(1));     break; }
  12.                                 }
  13.                                 break;}
  14.                         case MotionEvent.ACTION_MOVE: {
  15.                                 switch (event.getPointerCount()) {
  16.                                         case 1 : { controls.pOnTouch (PasObj,Const.TouchMove,1,
  17.                                                         event.getX(0),event.getY(0),0,0); break; }
  18.                                         default: { controls.pOnTouch (PasObj,Const.TouchMove,2,
  19.                                                         event.getX(0),event.getY(0),
  20.                                                         event.getX(1),event.getY(1));     break; }
  21.                                 }
  22.                                 break;}
  23.                         case MotionEvent.ACTION_UP: {
  24.                                
  25.                                 controls.pOnClick(PasObj,Const.Click_Default);
  26.                                
  27.                                 switch (event.getPointerCount()) {
  28.                                         case 1 : { controls.pOnTouch (PasObj,Const.TouchUp  ,1,
  29.                                                         event.getX(0),event.getY(0),0,0); break; }
  30.                                         default: { controls.pOnTouch (PasObj,Const.TouchUp  ,2,
  31.                                                         event.getX(0),event.getY(0),
  32.                                                         event.getX(1),event.getY(1));     break; }
  33.                                 }
  34.                                 break;}
  35.                         case MotionEvent.ACTION_POINTER_DOWN: {
  36.                                 switch (event.getPointerCount()) {
  37.                                         case 1 : { controls.pOnTouch (PasObj,Const.TouchDown,1,
  38.                                                         event.getX(0),event.getY(0),0,0); break; }
  39.                                         default: { controls.pOnTouch (PasObj,Const.TouchDown,2,
  40.                                                         event.getX(0),event.getY(0),
  41.                                                         event.getX(1),event.getY(1));     break; }
  42.                                 }
  43.                                 break;}
  44.                         case MotionEvent.ACTION_POINTER_UP  : {
  45.                                
  46.                                 controls.pOnClick(PasObj,Const.Click_Default);
  47.                                
  48.                                 switch (event.getPointerCount()) {
  49.                                         case 1 : { controls.pOnTouch (PasObj,Const.TouchUp  ,1,
  50.                                                         event.getX(0),event.getY(0),0,0); break; }
  51.                                         default: { controls.pOnTouch (PasObj,Const.TouchUp  ,2,
  52.                                                         event.getX(0),event.getY(0),
  53.                                                         event.getX(1),event.getY(1));     break; }
  54.                                 }
  55.                                 break;}
  56.                 }
  57.                 return true;
  58.         }
  59.  

Attached source code.

Thaddy

  • Hero Member
  • *****
  • Posts: 14213
  • Probably until I exterminate Putin.
Re: Suggestion, improvement and expansion of "jImageView"
« Reply #1 on: October 25, 2018, 05:06:15 pm »
Although useful, you should submit that against the Java project owner, because it has nothing to do with either FreePascal or Lazarus. (They auto-generate interfaces with Java only)
Specialize a type, not a var.

ADiV

  • Jr. Member
  • **
  • Posts: 90
    • ADiV Software
Re: Suggestion, improvement and expansion of "jImageView"
« Reply #2 on: October 25, 2018, 05:11:58 pm »
Although useful, you should submit that against the Java project owner, because it has nothing to do with either FreePascal or Lazarus. (They auto-generate interfaces with Java only)
Ok, I'll remember. Thank you.

jmpessoa

  • Hero Member
  • *****
  • Posts: 2297
Re: Suggestion, improvement and expansion of "jImageView"
« Reply #3 on: October 25, 2018, 08:52:02 pm »

Commited! 

(need tests!!!)

Thank you!

P.S.

Please, put "LAMW:" before the message subject...
Lamw: Lazarus Android Module Wizard
https://github.com/jmpessoa/lazandroidmodulewizard

 

TinyPortal © 2005-2018