Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.kitegamesstudio.stickerdemo;
- import android.content.Context;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Matrix;
- import android.graphics.Paint;
- import android.graphics.RectF;
- import android.os.Bundle;
- import android.support.annotation.Nullable;
- import android.support.v7.app.AppCompatActivity;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.RelativeLayout;
- import android.widget.Toast;
- import com.bumptech.glide.Glide;
- import com.esafirm.imagepicker.features.ImagePicker;
- import com.esafirm.imagepicker.model.Image;
- import com.kitegamesstudio.stickerdemo.util.BitmapUtil;
- import com.kitegamesstudio.stickerdemo.view.StickerView;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- public class TestActivity extends AppCompatActivity implements View.OnClickListener{
- public static int SAMPLER_SIZE = 2048;
- Button photoSelectBtn,stickerSelectBtn,saveBtn;
- Boolean isSticker = false;
- ImageView mImageView;
- List<StickerView> mStickers = new ArrayList<>();
- int mStatusBarHeight,mTitleBarHeight;
- RelativeLayout titleBar;
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_test);
- mStatusBarHeight = getStatusBarHeight();
- titleBar = (RelativeLayout) findViewById(R.id.titleBarID);
- saveBtn = (Button) findViewById(R.id.saveBtnID);
- photoSelectBtn = (Button) findViewById(R.id.photoSelecteID);
- stickerSelectBtn = (Button) findViewById(R.id.stickerSelecteID);
- mImageView = (ImageView) findViewById(R.id.imageViewID);
- saveBtn.setOnClickListener(this);
- photoSelectBtn.setOnClickListener(this);
- stickerSelectBtn.setOnClickListener(this);
- }
- @Override
- public void onWindowFocusChanged(boolean hasFocus) {
- super.onWindowFocusChanged(hasFocus);
- mTitleBarHeight = titleBar.getHeight();
- Log.d("titleBar1"," -> "+titleBar.getHeight()+" -> "+titleBar.getMeasuredHeight());
- }
- private int getStatusBarHeight() {
- int result = 0;
- int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
- if (resourceId > 0) {
- result = getResources().getDimensionPixelSize(resourceId);
- }
- return result;
- }
- @Override
- public void onClick(View view) {
- switch (view.getId()){
- case R.id.saveBtnID:
- saveEffectBitmap();
- Toast.makeText(TestActivity.this, "Saved", Toast.LENGTH_LONG).show();
- break;
- case R.id.photoSelecteID:
- isSticker = false;
- openPicker();
- break;
- case R.id.stickerSelecteID:
- isSticker = true;
- openPicker();
- break;
- }
- }
- public void openPicker(){
- ImagePicker.create(this)
- .folderMode(true) // folder mode (false by default)
- .toolbarFolderTitle("Folder") // folder selection title
- .toolbarImageTitle("Tap to select") // image selection title
- .toolbarArrowColor(Color.BLACK) // Toolbar 'up' arrow color
- .includeVideo(false) // Show video on image picker
- .single() // single mode
- .multi() // multi mode (default mode)
- .limit(1) // max images can be selected (99 by default)
- .showCamera(true) // show camera or not (true by default)
- .imageDirectory("Camera") // directory name for captured image ("Camera" folder by default)
- .start(); // start image picker activity with request code
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
- if (ImagePicker.shouldHandle(requestCode, resultCode, data)) {
- Image image = ImagePicker.getFirstImageOrNull(data);
- String imagePath = image.getPath();
- Log.d("imagePath",""+imagePath);
- if(isSticker){
- addStickerItem(imagePath);
- isSticker = false;
- }else{
- setImage(imagePath);
- }
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
- private void setImage(String imagePath){
- Glide.with(TestActivity.this)
- .load(imagePath)
- .into(mImageView);
- }
- private void addStickerItem(String stickerPath) {
- resetStickersFocus();
- final StickerView stickerView = new StickerView(this);
- RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
- params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.imageViewID);
- params.addRule(RelativeLayout.ALIGN_TOP, R.id.imageViewID);
- ((ViewGroup) mImageView.getParent()).addView(stickerView, params);
- BitmapFactory.Options bmOptions = new BitmapFactory.Options();
- Bitmap bitmap = BitmapFactory.decodeFile(stickerPath, bmOptions);
- // Bitmap bitmap = decodeFileToBitmap(stickerPath);
- float bitmapAspetRatio = (bitmap.getWidth() / (float)bitmap.getHeight());
- float width = 300;
- float height = (width / bitmapAspetRatio);
- Log.d("bitmap"," W: "+width+" H: "+height+" ratio: "+bitmapAspetRatio);
- bmOptions.inSampleSize = calculateInSampleSize(bmOptions, (int)width, (int)height);
- bitmap = BitmapFactory.decodeFile(stickerPath,bmOptions);
- // Matrix matrix = new Matrix();
- // matrix.postScale(width,height);
- // matrix.setScale(width,height);
- // matrix.setScale(0,0,width,height);
- /*float[] values = new float[9];
- matrix.getValues(values);
- values[Matrix.MSCALE_X] = width;
- values[Matrix.MSCALE_Y] = height;*/
- // bitmap = Bitmap.createBitmap(bitmap,0,0,width,height);
- // bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
- // bitmap = Bitmap.createScaledBitmap(bitmap,(int)width,(int)height,true);
- stickerView.setWaterMark(bitmap);
- mStickers.add(stickerView);
- stickerView.setOnStickerDeleteListener(new StickerView.OnStickerListener() {
- @Override
- public void onDelete(StickerView stickerView) {
- if (mStickers.contains(stickerView))
- mStickers.remove(stickerView);
- }
- @Override
- public void onMoreSticker(Bitmap stickerBitmap, Matrix matrix, RectF rectF,float[] points) {
- moreStickerItem(stickerBitmap,matrix,rectF,points);
- }
- /*@Override
- public void onMoreSticker(StickerView stickerView) {
- moreStickerItem(stickerView);
- }*/
- });
- }
- private void moreStickerItem(Bitmap stickerBitmap, Matrix matrix, final RectF rectF,float[] points){
- resetStickersFocus();
- StickerView stickerView = new StickerView(this);
- RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
- params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.imageViewID);
- params.addRule(RelativeLayout.ALIGN_TOP, R.id.imageViewID);
- ((ViewGroup) mImageView.getParent()).addView(stickerView, params);
- stickerView.setWaterMark(stickerBitmap,matrix,rectF,points);
- mStickers.add(stickerView);
- stickerView.setOnStickerDeleteListener(new StickerView.OnStickerListener() {
- @Override
- public void onDelete(StickerView stickerView) {
- if (mStickers.contains(stickerView))
- mStickers.remove(stickerView);
- }
- /*@Override
- public void onMoreSticker(Bitmap stickerBitmap) {
- moreStickerItem(stickerBitmap);
- }*/
- @Override
- public void onMoreSticker(Bitmap stickerBitmap,Matrix matrix,RectF rectF,float[] points) {
- moreStickerItem(stickerBitmap,matrix,rectF,points);
- }
- });
- }
- private void moreStickerItem(StickerView stickerView){
- StickerView view = new StickerView(this);
- view = stickerView;
- resetStickersFocus();
- RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
- params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.imageViewID);
- params.addRule(RelativeLayout.ALIGN_TOP, R.id.imageViewID);
- ((ViewGroup) mImageView.getParent()).addView(view, params);
- mStickers.add(view);
- /*view.setOnStickerDeleteListener(new StickerView.OnStickerListener() {
- @Override
- public void onDelete(StickerView stickerView) {
- if (mStickers.contains(stickerView))
- mStickers.remove(stickerView);
- }
- @Override
- public void onMoreSticker(StickerView stickerView) {
- moreStickerItem(stickerView);
- }
- });*/
- }
- private void moreStickerItem(){
- StickerView stickerView1 = new StickerView(this);
- // LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- for (StickerView stickerView : mStickers) {
- if(stickerView.isFocusable()){
- int id = stickerView.getId();
- // StickerView view = (StickerView) inflater.inflate((int)stickerView.getId(), null);
- stickerView1 = stickerView;
- stickerView1.setId((int)Math.random());
- }
- }
- resetStickersFocus();
- RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
- params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.imageViewID);
- params.addRule(RelativeLayout.ALIGN_TOP, R.id.imageViewID);
- ((ViewGroup) mImageView.getParent()).addView(stickerView1, params);
- mStickers.add(stickerView1);
- /*stickerView1.setOnStickerDeleteListener(new StickerView.OnStickerListener() {
- @Override
- public void onDelete(StickerView stickerView) {
- if (mStickers.contains(stickerView))
- mStickers.remove(stickerView);
- }
- @Override
- public void onMoreSticker(Bitmap stickerBitmap) {
- moreStickerItem();
- }
- });*/
- }
- private void resetStickersFocus() {
- for (StickerView stickerView : mStickers) {
- stickerView.setFocusable(false);
- }
- }
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- if (ev.getAction() == MotionEvent.ACTION_DOWN) {
- float x = ev.getX();
- //calculate action point Y apart from Container layout origin
- float y = ev.getY() - mTitleBarHeight - mStatusBarHeight;
- boolean flagTouch = false;
- int i = 0,idx = -1;
- for (StickerView stickerView : mStickers) {
- // dispatch focus to the sticker based on Coordinate
- // boolean isContains = stickerView.getContentRect().contains(x, y);
- boolean isContains = stickerView.checkTouch(x, y);
- /*Log.d("isRect",""+stickerView.getContentRect()+" -> "+x+ " "+y);
- Log.e("isRect1","( "+stickerView.mPoints[0]+","+stickerView.mPoints[1]+" )"+"( "+stickerView.mPoints[2]+","+stickerView.mPoints[3]+" )"
- +"( "+stickerView.mPoints[4]+","+stickerView.mPoints[5]+" )"+"( "+stickerView.mPoints[6]+","+stickerView.mPoints[7]+" )"
- +"( "+stickerView.mPoints[8]+","+stickerView.mPoints[9]+" )");*/
- if (isContains) {
- resetStickersFocus();
- stickerView.setFocusable(true);
- stickerView.bringToFront();
- flagTouch = true;
- idx = i;
- break;
- }
- i++;
- }
- if(!flagTouch) {
- resetStickersFocus();
- }else if(idx!= -1){
- Collections.swap(mStickers,0,idx);
- }
- }
- return super.dispatchTouchEvent(ev);
- // return true;
- }
- /**
- * save image with stickers
- */
- public void saveEffectBitmap() {
- mImageView.setDrawingCacheEnabled(true);
- mImageView.buildDrawingCache();
- Bitmap saveBitmap = mImageView.getDrawingCache();//get background bitmap
- saveBitmap = Bitmap.createBitmap(saveBitmap, 0, 0, saveBitmap.getWidth(), saveBitmap.getHeight());//create bitmap with size
- mImageView.destroyDrawingCache();
- Canvas canvas = new Canvas(saveBitmap);//create canvas with background bitmap size
- Paint paint = new Paint();
- canvas.drawBitmap(saveBitmap, 0, 0, paint);
- //draw stickers on canvas
- for (StickerView stickerView : mStickers) {
- Bitmap bmSticker = stickerView.getBitmap();
- canvas.drawBitmap(bmSticker, 0, 0, paint);
- }
- canvas.save();
- canvas.restore();
- String saveImagePath = BitmapUtil.storeImage(saveBitmap,getApplicationContext());
- Log.d("savePath",""+saveImagePath);
- }
- public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
- // Raw height and width of image
- final int height = options.outHeight;
- final int width = options.outWidth;
- int inSampleSize = 1;
- if (height > reqHeight || width > reqWidth) {
- final int halfHeight = height / 2;
- final int halfWidth = width / 2;
- // Calculate the largest inSampleSize value that is a power of 2 and keeps both
- // height and width larger than the requested height and width.
- while ((halfHeight / inSampleSize) > reqHeight
- && (halfWidth / inSampleSize) > reqWidth) {
- inSampleSize *= 2;
- }
- }
- return inSampleSize;
- }
- public static Bitmap decodeFileToBitmap(String pathName)
- throws OutOfMemoryError {
- try {
- // decode image size
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true;
- BitmapFactory.decodeFile(pathName, options);
- // Find the correct scale value. It should be the power of 2.
- int width_tmp = options.outWidth, height_tmp = options.outHeight;
- int scale = 1;
- int requiredSize = SAMPLER_SIZE;
- while (true) {
- if (width_tmp / 2 <= requiredSize
- || height_tmp / 2 <= requiredSize)
- break;
- width_tmp /= 2;
- height_tmp /= 2;
- scale *= 2;
- }
- // decode with inSampleSize
- options.inJustDecodeBounds = false;
- options.inSampleSize = scale;
- return BitmapFactory.decodeFile(pathName, options);
- } catch (Exception ex) {
- ex.printStackTrace();
- } catch (OutOfMemoryError err) {
- err.printStackTrace();
- throw err;
- }
- return null;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement