package net.robinx.blur;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import net.robinx.lib.blur.StackBlur;
import net.robinx.lib.blur.utils.BlurUtils;
import java.util.ArrayList;
import java.util.List;
public class BlurActivity extends AppCompatActivity {
private static final int REQUEST_CODE_CHOOSE_GALLERY_IMAGE = 0x01;
private ImageView mRootImageView;
private ImageView mOriginalImageView;
private ImageView mBlurImageView;
private CheckBox mCompressCheckBox;
private TextView mBlurTimeTextView;
private Bitmap mOriginalBitmap;
private Bitmap mCompressedBitmap;
private int blurRadius = 5;
private static final int JAVA_BLUR = 0x01,JNI_BITMAP_BLUR = 0x02,JNI_PIXELS_BLUR = 0x03,RENDER_SCRIPT_BLUR = 0x04;
private int BlurMode = RENDER_SCRIPT_BLUR;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blur);
init();
}
private void init() {
mRootImageView = (ImageView) this.findViewById(R.id.img_root_bg);
mBlurTimeTextView = (TextView) this.findViewById(R.id.tv_blur_time);
mOriginalImageView = (ImageView) this.findViewById(R.id.img_origin);
mBlurImageView = (ImageView) this.findViewById(R.id.img_blur);
this.findViewById(R.id.tv_choose).setOnClickListener(getOnClickListener());
this.findViewById(R.id.tv_blur).setOnClickListener(getOnClickListener());
Spinner spinner = (Spinner) this.findViewById(R.id.sp);
mCompressCheckBox = (CheckBox) this.findViewById(R.id.cb_compress);
final TextView radiusTextView = (TextView) this.findViewById(R.id.tv_radius);
SeekBar radiusSeekBar = (SeekBar) this.findViewById(R.id.sb_radius);
//background
Bitmap bgBitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.bg_2);
Bitmap compressedBgBitmap = BlurUtils.compressBitmap(bgBitmap,8);
Bitmap blurBgBitmap = StackBlur.blurNativelyPixels(compressedBgBitmap,25,false);
mRootImageView.setImageBitmap(blurBgBitmap);
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mRootImageView,View.ALPHA,0,1f);
alphaAnimator.setDuration(2000);
alphaAnimator.start();
List<String> strings = new ArrayList<>();
strings.add("render script");
strings.add("jni pixels");
strings.add("jni bitmap");
strings.add("java");
spinner.setAdapter(new SpinnerAdapter(strings));
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
switch (i) {
case 0:
BlurMode = RENDER_SCRIPT_BLUR;
break;
case 1:
BlurMode = JNI_PIXELS_BLUR;
break;
case 2:
BlurMode = JNI_BITMAP_BLUR;
break;
case 3:
BlurMode = JAVA_BLUR;
break;
}
blur();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
mCompressCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
blur();
}
});
radiusSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
blurRadius = i;
radiusTextView.setText("blur radius:"+i);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
blur();
}
});
}
private View.OnClickListener mOnClickListener;
private View.OnClickListener getOnClickListener() {
if (mOnClickListener == null) {
mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.tv_choose:
chooseGalleryImage(BlurActivity.this, REQUEST_CODE_CHOOSE_GALLERY_IMAGE);
break;
case R.id.tv_blur:
blur();
break;
}
}
};
}
return mOnClickListener;
}
private void blur() {
if (mOriginalBitmap == null) {
return;
}
final Bitmap willBlurBitmap ;
if (mCompressCheckBox.isChecked()) {
willBlurBitmap = mCompressedBitmap;
} else {
willBlurBitmap = mOriginalBitmap;
}
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setCancelable(true);
new AsyncTask<Void,Void,Bitmap>(){
@Override
protected void onPreExecute() {
progressDialog.show();
}
@Override
protected Bitmap doInBackground(Void... voids) {
long blurStartTime = System.currentTimeMillis();
Bitmap blurBitmap = null;
switch (BlurMode) {
case JAVA_BLUR:
Log.i("robin","BlurMode:JAVA");
blurBitmap = StackBlur.blurJava(willBlurBitmap, blurRadius, false);
break;
case JNI_BITMAP_BLUR:
Log.i("robin","BlurMode:JNI_BITMAP");
blurBitmap = StackBlur.blurNatively(willBlurBitmap, blurRadius, false);
break;
case JNI_PIXELS_BLUR:
Log.i("robin","BlurMode:JNI_PIXELS");
blurBitmap = StackBlur.blurNativelyPixels(willBlurBitmap, blurRadius, false);
break;
case RENDER_SCRIPT_BLUR:
Log.i("robin","BlurMode:RENDER_SCRIPT");
blurBitmap = StackBlur.blurRenderScript(BlurActivity.this,willBlurBitmap, blurRadius, false);
break;
}
final long blurTime = System.currentTimeMillis() - blurStartTime;
runOnUiThread(new Runnable() {
@Override
public void run() {
mBlurTimeTextView.setText("blur time: "+blurTime+" ms");
}
});
return blurBitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
progressDialog.dismiss();
mBlurImageView.setImageBitmap(bitmap);
}
}.execute();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CODE_CHOOSE_GALLERY_IMAGE:
if (data == null) {
return;
}
clearImageView();
String picPath = chooseGalleryImageHandler(BlurActivity.this, data);
Log.i("robin","PicPath:"+picPath);
// Original
mOriginalBitmap = BitmapFactory.decodeFile(picPath);
// Compress
/*Matrix matrix = new Matrix();
matrix.postScale(1.0f / 6, 1.0f / 6);
mCompressedBitmap = Bitmap.createBitmap(mOriginalBitmap, 0, 0,
mOriginalBitmap.getWidth(), mOriginalBitmap.getHeight(), matrix, true);*/
mCompressedBitmap = BlurUtils.compressBitmap(mOriginalBitmap,6);
mOriginalImageView.setImageBitmap(mOriginalBitmap);
break;
}
}
public void clearImageView() {
mOriginalImageView.setImageBitmap(null);
mBlurImageView.setImageBitmap(null);
}
public static void chooseGalleryImage(Activity activity, int requestCode) {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
activity.startActivityForResult(intent, requestCode);
}
public static String chooseGalleryImageHandler(
Context context, Intent data) {
if (data == null) {
return null ;
}
Uri uri = data.getData();
String filePath;
if (uri.toString().substring(0, 4).equals("file")) {
filePath = uri.getPath();
} else {
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null);
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
filePath = cursor.getString(columnIndex);
}
return filePath;
}
public static class SpinnerAdapter extends BaseAdapter{
private List<String> mStrings;
public SpinnerAdapter(List<String> strings) {
mStrings = strings;
}
@Override
public int getCount() {
return mStrings.size();
}
@Override
public Object getItem(int i) {
return mStrings.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
if (view == null) {
viewHolder = new ViewHolder();
view = View.inflate(viewGroup.getContext(), R.layout.item_spinner, null);
viewHolder.mTextView = (TextView) view.findViewById(R.id.tv);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.mTextView.setText(mStrings.get(i));
return view;
}
class ViewHolder{
TextView mTextView;
}
}
}