Suggestion, improvement and expansion of "jImageView" lazarus / 43-Android ---------------------------------------------------------------------- ADiV · 2018-10-25 14:59 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][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i         // Bitmap scaling with smoothing        private Bitmap GetResizedBitmap(Bitmap _bmp, int _newWidth, int _newHeight){                                           // Get current dimensions               int width  = _bmp.getWidth();                 int height = _bmp.getHeight();                  // Determine how much to scale               float xScale = ((float) _newWidth) / width;                 float yScale = ((float) _newHeight) / height;                               // Create a matrix for the scaling and add the scaling data               Matrix matrix = new Matrix();                 matrix.postScale(xScale, yScale);                  // Create a new bitmap and convert it to a format understood by the ImageView               Bitmap scaledBitmap = Bitmap.createBitmap(_bmp, 0, 0, width, height, matrix, true);                 BitmapDrawable result = new BitmapDrawable(scaledBitmap);                 width  = scaledBitmap.getWidth();                 height = scaledBitmap.getHeight();                  // Apply the scaled bitmap                 this.setImageDrawable(result);                 this.invalidate();                                  Drawable drawing = this.getDrawable();                 Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();                 return bitmap;                }  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][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i         public void SetImageMatrixScale(float _scaleX, float _scaleY, float _centerX, float _centerY ) {                                if ( this.getScaleType() != ImageView.ScaleType.MATRIX)                        this.setScaleType(ImageView.ScaleType.MATRIX);                              mMatrix.setScale(_scaleX, _scaleY, _centerX, _centerY);                              this.setImageMatrix(mMatrix);                         this.invalidate();        }         public void SetImageMatrixScale(float _scaleX, float _scaleY ) {                              SetImageMatrixScale( _scaleX, _scaleY, 0, 0 );        }  It has also added events, "OnTouchDown", "OnTouchUp" and "OnTouchMove": Code: Java  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i        public  boolean onTouchEvent( MotionEvent event) {                                              int act     = event.getAction() & MotionEvent.ACTION_MASK;                switch(act) {                      case MotionEvent.ACTION_DOWN: {                                switch (event.getPointerCount()) {                                      case 1 : { controls.pOnTouch (PasObj,Const.TouchDown,1,                                                      event.getX(0),event.getY(0),0,0); break; }                                      default: { controls.pOnTouch (PasObj,Const.TouchDown,2,                                                      event.getX(0),event.getY(0),                                                      event.getX(1),event.getY(1));     break; }                              }                                break;}                       case MotionEvent.ACTION_MOVE: {                              switch (event.getPointerCount()) {                                      case 1 : { controls.pOnTouch (PasObj,Const.TouchMove,1,                                                      event.getX(0),event.getY(0),0,0); break; }                                      default: { controls.pOnTouch (PasObj,Const.TouchMove,2,                                                      event.getX(0),event.getY(0),                                                      event.getX(1),event.getY(1));     break; }                              }                                break;}                      case MotionEvent.ACTION_UP: {                                                              controls.pOnClick(PasObj,Const.Click_Default);                                                              switch (event.getPointerCount()) {                                        case 1 : { controls.pOnTouch (PasObj,Const.TouchUp  ,1,                                                      event.getX(0),event.getY(0),0,0); break; }                                      default: { controls.pOnTouch (PasObj,Const.TouchUp  ,2,                                                      event.getX(0),event.getY(0),                                                      event.getX(1),event.getY(1));     break; }                              }                                break;}                      case MotionEvent.ACTION_POINTER_DOWN: {                              switch (event.getPointerCount()) {                                      case 1 : { controls.pOnTouch (PasObj,Const.TouchDown,1,                                                      event.getX(0),event.getY(0),0,0); break; }                                      default: { controls.pOnTouch (PasObj,Const.TouchDown,2,                                                      event.getX(0),event.getY(0),                                                      event.getX(1),event.getY(1));     break; }                              }                                break;}                      case MotionEvent.ACTION_POINTER_UP  : {                                                              controls.pOnClick(PasObj,Const.Click_Default);                                                              switch (event.getPointerCount()) {                                        case 1 : { controls.pOnTouch (PasObj,Const.TouchUp  ,1,                                                      event.getX(0),event.getY(0),0,0); break; }                                      default: { controls.pOnTouch (PasObj,Const.TouchUp  ,2,                                                      event.getX(0),event.getY(0),                                                      event.getX(1),event.getY(1));     break; }                              }                                break;}              }                return true;        }  Attached source code. ---------------------------------------------------------------------- Thaddy · 2018-10-25 15:06 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) ---------------------------------------------------------------------- ADiV · 2018-10-25 15:11 Quote from: Thaddy on October 25, 2018, 05:06:15 pmAlthough 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 · 2018-10-25 18:52 Commited!  (need tests!!!) Thank you! P.S. Please, put "LAMW:" before the message subject...