Advertisement
ghorardim

TestActivity

Sep 19th, 2019
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.05 KB | None | 0 0
  1. package com.kitegamesstudio.stickerdemo;
  2.  
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.graphics.Bitmap;
  6. import android.graphics.BitmapFactory;
  7. import android.graphics.Canvas;
  8. import android.graphics.Color;
  9. import android.graphics.Matrix;
  10. import android.graphics.Paint;
  11. import android.graphics.RectF;
  12. import android.os.Bundle;
  13. import android.support.annotation.Nullable;
  14. import android.support.v7.app.AppCompatActivity;
  15. import android.util.AttributeSet;
  16. import android.util.Log;
  17. import android.view.LayoutInflater;
  18. import android.view.MotionEvent;
  19. import android.view.View;
  20. import android.view.ViewGroup;
  21. import android.widget.Button;
  22. import android.widget.ImageView;
  23. import android.widget.RelativeLayout;
  24. import android.widget.Toast;
  25.  
  26. import com.bumptech.glide.Glide;
  27. import com.esafirm.imagepicker.features.ImagePicker;
  28. import com.esafirm.imagepicker.model.Image;
  29. import com.kitegamesstudio.stickerdemo.util.BitmapUtil;
  30. import com.kitegamesstudio.stickerdemo.view.StickerView;
  31.  
  32. import java.util.ArrayList;
  33. import java.util.Collections;
  34. import java.util.List;
  35.  
  36. public class TestActivity extends AppCompatActivity implements View.OnClickListener{
  37.     public static int SAMPLER_SIZE = 2048;
  38.     Button photoSelectBtn,stickerSelectBtn,saveBtn;
  39.     Boolean isSticker = false;
  40.     ImageView mImageView;
  41.     List<StickerView> mStickers = new ArrayList<>();
  42.     int mStatusBarHeight,mTitleBarHeight;
  43.     RelativeLayout titleBar;
  44.  
  45.     @Override
  46.     protected void onCreate(@Nullable Bundle savedInstanceState) {
  47.         super.onCreate(savedInstanceState);
  48.         setContentView(R.layout.activity_test);
  49.         mStatusBarHeight = getStatusBarHeight();
  50.         titleBar = (RelativeLayout) findViewById(R.id.titleBarID);
  51.         saveBtn = (Button) findViewById(R.id.saveBtnID);
  52.         photoSelectBtn = (Button) findViewById(R.id.photoSelecteID);
  53.         stickerSelectBtn = (Button) findViewById(R.id.stickerSelecteID);
  54.         mImageView = (ImageView) findViewById(R.id.imageViewID);
  55.         saveBtn.setOnClickListener(this);
  56.         photoSelectBtn.setOnClickListener(this);
  57.         stickerSelectBtn.setOnClickListener(this);
  58.     }
  59.  
  60.     @Override
  61.     public void onWindowFocusChanged(boolean hasFocus) {
  62.         super.onWindowFocusChanged(hasFocus);
  63.         mTitleBarHeight = titleBar.getHeight();
  64.         Log.d("titleBar1"," -> "+titleBar.getHeight()+" -> "+titleBar.getMeasuredHeight());
  65.     }
  66.  
  67.     private int getStatusBarHeight() {
  68.         int result = 0;
  69.         int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
  70.         if (resourceId > 0) {
  71.             result = getResources().getDimensionPixelSize(resourceId);
  72.         }
  73.         return result;
  74.     }
  75.  
  76.     @Override
  77.     public void onClick(View view) {
  78.         switch (view.getId()){
  79.             case R.id.saveBtnID:
  80.                 saveEffectBitmap();
  81.                 Toast.makeText(TestActivity.this, "Saved", Toast.LENGTH_LONG).show();
  82.                 break;
  83.             case R.id.photoSelecteID:
  84.                 isSticker = false;
  85.                 openPicker();
  86.                 break;
  87.             case R.id.stickerSelecteID:
  88.                 isSticker = true;
  89.                 openPicker();
  90.                 break;
  91.         }
  92.     }
  93.     public void openPicker(){
  94.         ImagePicker.create(this)
  95.                 .folderMode(true) // folder mode (false by default)
  96.                 .toolbarFolderTitle("Folder") // folder selection title
  97.                 .toolbarImageTitle("Tap to select") // image selection title
  98.                 .toolbarArrowColor(Color.BLACK) // Toolbar 'up' arrow color
  99.                 .includeVideo(false) // Show video on image picker
  100.                 .single() // single mode
  101.                 .multi() // multi mode (default mode)
  102.                 .limit(1) // max images can be selected (99 by default)
  103.                 .showCamera(true) // show camera or not (true by default)
  104.                 .imageDirectory("Camera") // directory name for captured image  ("Camera" folder by default)
  105.                 .start(); // start image picker activity with request code
  106.     }
  107.  
  108.     @Override
  109.     protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  110.         if (ImagePicker.shouldHandle(requestCode, resultCode, data)) {
  111.             Image image = ImagePicker.getFirstImageOrNull(data);
  112.             String imagePath = image.getPath();
  113.             Log.d("imagePath",""+imagePath);
  114.             if(isSticker){
  115.                 addStickerItem(imagePath);
  116.                 isSticker = false;
  117.             }else{
  118.                 setImage(imagePath);
  119.             }
  120.         }
  121.         super.onActivityResult(requestCode, resultCode, data);
  122.     }
  123.     private void setImage(String imagePath){
  124.         Glide.with(TestActivity.this)
  125.                 .load(imagePath)
  126.                 .into(mImageView);
  127.     }
  128.     private void addStickerItem(String stickerPath) {
  129.         resetStickersFocus();
  130.         final StickerView stickerView = new StickerView(this);
  131.         RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
  132.                 ViewGroup.LayoutParams.MATCH_PARENT,
  133.                 ViewGroup.LayoutParams.MATCH_PARENT);
  134.         params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.imageViewID);
  135.         params.addRule(RelativeLayout.ALIGN_TOP, R.id.imageViewID);
  136.         ((ViewGroup) mImageView.getParent()).addView(stickerView, params);
  137.         BitmapFactory.Options bmOptions = new BitmapFactory.Options();
  138.         Bitmap bitmap = BitmapFactory.decodeFile(stickerPath, bmOptions);
  139.     //    Bitmap bitmap = decodeFileToBitmap(stickerPath);
  140.         float bitmapAspetRatio =  (bitmap.getWidth() / (float)bitmap.getHeight());
  141.         float width = 300;
  142.         float height = (width / bitmapAspetRatio);
  143.         Log.d("bitmap"," W: "+width+" H: "+height+" ratio: "+bitmapAspetRatio);
  144.         bmOptions.inSampleSize = calculateInSampleSize(bmOptions, (int)width, (int)height);
  145.         bitmap = BitmapFactory.decodeFile(stickerPath,bmOptions);
  146.     //    Matrix matrix = new Matrix();
  147.      //   matrix.postScale(width,height);
  148.      //   matrix.setScale(width,height);
  149.     //    matrix.setScale(0,0,width,height);
  150.         /*float[] values = new float[9];
  151.         matrix.getValues(values);
  152.         values[Matrix.MSCALE_X] = width;
  153.         values[Matrix.MSCALE_Y] = height;*/
  154.       //  bitmap = Bitmap.createBitmap(bitmap,0,0,width,height);
  155. //        bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
  156.  //       bitmap = Bitmap.createScaledBitmap(bitmap,(int)width,(int)height,true);
  157.         stickerView.setWaterMark(bitmap);
  158.         mStickers.add(stickerView);
  159.         stickerView.setOnStickerDeleteListener(new StickerView.OnStickerListener() {
  160.             @Override
  161.             public void onDelete(StickerView stickerView) {
  162.                 if (mStickers.contains(stickerView))
  163.                     mStickers.remove(stickerView);
  164.             }
  165.             @Override
  166.             public void onMoreSticker(Bitmap stickerBitmap, Matrix matrix, RectF rectF,float[] points) {
  167.                 moreStickerItem(stickerBitmap,matrix,rectF,points);
  168.             }
  169.             /*@Override
  170.             public void onMoreSticker(StickerView stickerView) {
  171.                 moreStickerItem(stickerView);
  172.             }*/
  173.         });
  174.     }
  175.     private void moreStickerItem(Bitmap stickerBitmap, Matrix matrix, final RectF rectF,float[] points){
  176.         resetStickersFocus();
  177.         StickerView stickerView = new StickerView(this);
  178.         RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
  179.                 ViewGroup.LayoutParams.MATCH_PARENT,
  180.                 ViewGroup.LayoutParams.MATCH_PARENT);
  181.         params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.imageViewID);
  182.         params.addRule(RelativeLayout.ALIGN_TOP, R.id.imageViewID);
  183.         ((ViewGroup) mImageView.getParent()).addView(stickerView, params);
  184.         stickerView.setWaterMark(stickerBitmap,matrix,rectF,points);
  185.         mStickers.add(stickerView);
  186.         stickerView.setOnStickerDeleteListener(new StickerView.OnStickerListener() {
  187.             @Override
  188.             public void onDelete(StickerView stickerView) {
  189.                 if (mStickers.contains(stickerView))
  190.                     mStickers.remove(stickerView);
  191.             }
  192.             /*@Override
  193.             public void onMoreSticker(Bitmap stickerBitmap) {
  194.                 moreStickerItem(stickerBitmap);
  195.             }*/
  196.             @Override
  197.             public void onMoreSticker(Bitmap stickerBitmap,Matrix matrix,RectF rectF,float[] points) {
  198.                 moreStickerItem(stickerBitmap,matrix,rectF,points);
  199.             }
  200.         });
  201.     }
  202.     private void moreStickerItem(StickerView stickerView){
  203.         StickerView view = new StickerView(this);
  204.         view = stickerView;
  205.         resetStickersFocus();
  206.         RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
  207.                 ViewGroup.LayoutParams.MATCH_PARENT,
  208.                 ViewGroup.LayoutParams.MATCH_PARENT);
  209.         params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.imageViewID);
  210.         params.addRule(RelativeLayout.ALIGN_TOP, R.id.imageViewID);
  211.         ((ViewGroup) mImageView.getParent()).addView(view, params);
  212.         mStickers.add(view);
  213.         /*view.setOnStickerDeleteListener(new StickerView.OnStickerListener() {
  214.             @Override
  215.             public void onDelete(StickerView stickerView) {
  216.                 if (mStickers.contains(stickerView))
  217.                     mStickers.remove(stickerView);
  218.             }
  219.             @Override
  220.             public void onMoreSticker(StickerView stickerView) {
  221.                 moreStickerItem(stickerView);
  222.             }
  223.         });*/
  224.     }
  225.     private void moreStickerItem(){
  226.         StickerView stickerView1 = new StickerView(this);
  227.      //   LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  228.  
  229.         for (StickerView stickerView : mStickers) {
  230.             if(stickerView.isFocusable()){
  231.                 int id = stickerView.getId();
  232.       //          StickerView view = (StickerView) inflater.inflate((int)stickerView.getId(), null);
  233.                 stickerView1  = stickerView;
  234.                 stickerView1.setId((int)Math.random());
  235.             }
  236.         }
  237.         resetStickersFocus();
  238.         RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
  239.                 ViewGroup.LayoutParams.MATCH_PARENT,
  240.                 ViewGroup.LayoutParams.MATCH_PARENT);
  241.         params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.imageViewID);
  242.         params.addRule(RelativeLayout.ALIGN_TOP, R.id.imageViewID);
  243.         ((ViewGroup) mImageView.getParent()).addView(stickerView1, params);
  244.         mStickers.add(stickerView1);
  245.         /*stickerView1.setOnStickerDeleteListener(new StickerView.OnStickerListener() {
  246.             @Override
  247.             public void onDelete(StickerView stickerView) {
  248.                 if (mStickers.contains(stickerView))
  249.                     mStickers.remove(stickerView);
  250.             }
  251.             @Override
  252.             public void onMoreSticker(Bitmap stickerBitmap) {
  253.                 moreStickerItem();
  254.             }
  255.         });*/
  256.     }
  257.     private void resetStickersFocus() {
  258.         for (StickerView stickerView : mStickers) {
  259.             stickerView.setFocusable(false);
  260.         }
  261.     }
  262.  
  263.     @Override
  264.     public boolean dispatchTouchEvent(MotionEvent ev) {
  265.         if (ev.getAction() == MotionEvent.ACTION_DOWN) {
  266.             float x = ev.getX();
  267.             //calculate action point Y apart from Container layout origin
  268.             float y = ev.getY() - mTitleBarHeight - mStatusBarHeight;
  269.             boolean flagTouch = false;
  270.             int i = 0,idx = -1;
  271.             for (StickerView stickerView : mStickers) {
  272.                 // dispatch focus to the sticker based on Coordinate
  273.          //       boolean isContains = stickerView.getContentRect().contains(x, y);
  274.                 boolean isContains = stickerView.checkTouch(x, y);
  275.                 /*Log.d("isRect",""+stickerView.getContentRect()+"  -> "+x+ " "+y);
  276.                 Log.e("isRect1","( "+stickerView.mPoints[0]+","+stickerView.mPoints[1]+" )"+"( "+stickerView.mPoints[2]+","+stickerView.mPoints[3]+" )"
  277.                 +"( "+stickerView.mPoints[4]+","+stickerView.mPoints[5]+" )"+"( "+stickerView.mPoints[6]+","+stickerView.mPoints[7]+" )"
  278.                         +"( "+stickerView.mPoints[8]+","+stickerView.mPoints[9]+" )");*/
  279.                 if (isContains) {
  280.                     resetStickersFocus();
  281.                     stickerView.setFocusable(true);
  282.                     stickerView.bringToFront();
  283.                     flagTouch = true;
  284.                     idx = i;
  285.                     break;
  286.                 }
  287.                 i++;
  288.             }
  289.             if(!flagTouch) {
  290.                 resetStickersFocus();
  291.             }else if(idx!= -1){
  292.                 Collections.swap(mStickers,0,idx);
  293.             }
  294.  
  295.         }
  296.         return super.dispatchTouchEvent(ev);
  297.       //  return  true;
  298.     }
  299.     /**
  300.      * save image with stickers
  301.      */
  302.     public void saveEffectBitmap() {
  303.  
  304.         mImageView.setDrawingCacheEnabled(true);
  305.         mImageView.buildDrawingCache();
  306.         Bitmap saveBitmap = mImageView.getDrawingCache();//get background bitmap
  307.         saveBitmap = Bitmap.createBitmap(saveBitmap, 0, 0, saveBitmap.getWidth(), saveBitmap.getHeight());//create bitmap with size
  308.         mImageView.destroyDrawingCache();
  309.         Canvas canvas = new Canvas(saveBitmap);//create canvas with background bitmap size
  310.         Paint paint = new Paint();
  311.         canvas.drawBitmap(saveBitmap, 0, 0, paint);
  312.         //draw stickers on canvas
  313.         for (StickerView stickerView : mStickers) {
  314.             Bitmap bmSticker = stickerView.getBitmap();
  315.             canvas.drawBitmap(bmSticker, 0, 0, paint);
  316.         }
  317.         canvas.save();
  318.         canvas.restore();
  319.         String saveImagePath = BitmapUtil.storeImage(saveBitmap,getApplicationContext());
  320.         Log.d("savePath",""+saveImagePath);
  321.     }
  322.     public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
  323.         // Raw height and width of image
  324.         final int height = options.outHeight;
  325.         final int width = options.outWidth;
  326.         int inSampleSize = 1;
  327.  
  328.         if (height > reqHeight || width > reqWidth) {
  329.  
  330.             final int halfHeight = height / 2;
  331.             final int halfWidth = width / 2;
  332.  
  333.             // Calculate the largest inSampleSize value that is a power of 2 and keeps both
  334.             // height and width larger than the requested height and width.
  335.             while ((halfHeight / inSampleSize) > reqHeight
  336.                     && (halfWidth / inSampleSize) > reqWidth) {
  337.                 inSampleSize *= 2;
  338.             }
  339.         }
  340.  
  341.         return inSampleSize;
  342.     }
  343.     public static Bitmap decodeFileToBitmap(String pathName)
  344.             throws OutOfMemoryError {
  345.         try {
  346.             // decode image size
  347.             BitmapFactory.Options options = new BitmapFactory.Options();
  348.             options.inJustDecodeBounds = true;
  349.             BitmapFactory.decodeFile(pathName, options);
  350.             // Find the correct scale value. It should be the power of 2.
  351.             int width_tmp = options.outWidth, height_tmp = options.outHeight;
  352.             int scale = 1;
  353.             int requiredSize = SAMPLER_SIZE;
  354.             while (true) {
  355.                 if (width_tmp / 2 <= requiredSize
  356.                         || height_tmp / 2 <= requiredSize)
  357.                     break;
  358.                 width_tmp /= 2;
  359.                 height_tmp /= 2;
  360.                 scale *= 2;
  361.             }
  362.  
  363.             // decode with inSampleSize
  364.             options.inJustDecodeBounds = false;
  365.             options.inSampleSize = scale;
  366.  
  367.             return BitmapFactory.decodeFile(pathName, options);
  368.         } catch (Exception ex) {
  369.             ex.printStackTrace();
  370.         } catch (OutOfMemoryError err) {
  371.             err.printStackTrace();
  372.             throw err;
  373.         }
  374.  
  375.         return null;
  376.     }
  377. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement