使用
BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inPreferredConfig = Bitmap.Config.RGB_565;
bm = BitmapFactory.decodeFile(uu, options2);
Bitmap bitmap=BitmapFactory.decodeFile(uu);
fragment_hello1.setImageBitmap(circleBitmapByShader(bitmap,
(int)getResources().getDimension(R.dimen.round_bitmap_width),
(int)getResources().getDimension(R.dimen.round_bitmap_width) / 2));
my_head.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialSelectPicDialog();
}
});
private final int IMAGE_REQUEST_CODE = 0;
private final int CAMERA_REQUEST_CODE = 1;
private final int RESULT_REQUEST_CODE = 2;
private Uri imageUri;
private int corpWidth = 240;
private int corpHeigth = 240;
/**
* 利用BitmapShader绘制底部圆角图片
*
* @param bitmap
* 待处理图片
* @param edgeWidth
* 正方形控件大小
* @param radius
* 圆角半径大小
* @return
* 结果图片
*/
private Bitmap circleBitmapByShader(Bitmap bitmap, int edgeWidth, int radius) {
if(bitmap == null) {
throw new NullPointerException("Bitmap can't be null");
}
float btWidth = bitmap.getWidth();
float btHeight = bitmap.getHeight();
// 水平方向开始裁剪的位置
float btWidthCutSite = 0;
// 竖直方向开始裁剪的位置
float btHeightCutSite = 0;
// 裁剪成正方形图片的边长,未拉伸缩放
float squareWidth = 0f;
if(btWidth > btHeight) { // 如果矩形宽度大于高度
btWidthCutSite = (btWidth - btHeight) / 2f;
squareWidth = btHeight;
} else { // 如果矩形宽度不大于高度
btHeightCutSite = (btHeight - btWidth) / 2f;
squareWidth = btWidth;
}
// 设置拉伸缩放比
float scale = edgeWidth * 1.0f / squareWidth;
Matrix matrix = new Matrix();
matrix.setScale(scale, scale);
// 将矩形图片裁剪成正方形并拉伸缩放到控件大小
Bitmap squareBt = Bitmap.createBitmap(bitmap, (int)btWidthCutSite, (int)btHeightCutSite, (int)squareWidth, (int)squareWidth, matrix, true);
// 初始化绘制纹理图
BitmapShader bitmapShader = new BitmapShader(squareBt, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
// 初始化目标bitmap
Bitmap targetBitmap = Bitmap.createBitmap(edgeWidth, edgeWidth, Bitmap.Config.ARGB_8888);
// 初始化目标画布
Canvas targetCanvas = new Canvas(targetBitmap);
// 初始化画笔
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(bitmapShader);
// 利用画笔绘制圆形图
targetCanvas.drawRoundRect(new RectF(0, 0, edgeWidth, edgeWidth), radius, radius, paint);
return targetBitmap;
}
private boolean hasSdcard() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
}
private void showDialSelectPicDialog() {
final DialSelectPicDialog.Builder builder = new DialSelectPicDialog.Builder(MyPersonalInformationActivity.this);
builder.setAlbumonButton(new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
new RxPermissions(MyPersonalInformationActivity.this).request(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean granted) {
if (granted) {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, IMAGE_REQUEST_CODE);
}
}
});
dialog.dismiss();
}
});
builder.setPhotoButton(new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
new RxPermissions(MyPersonalInformationActivity.this).request(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean granted) {
if (granted) {
if (hasSdcard()) {
File outputImage = new File(getExternalCacheDir(), DIAL_BG);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
imageUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileProvider", outputImage);
} else {
imageUri = Uri.fromFile(outputImage);
}
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, CAMERA_REQUEST_CODE);
}
}
}
});
dialog.dismiss();
}
});
builder.setCancelButton(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i("tga", "requestCode=" + requestCode + ",resultCode=" + resultCode);
if (resultCode != RESULT_CANCELED) {
switch (requestCode) {
case IMAGE_REQUEST_CODE://
startPhotoZoom(data.getData());
break;
case CAMERA_REQUEST_CODE:
if (hasSdcard()) {
startPhotoZoom(Uri.fromFile(new File(mContext.getExternalCacheDir(), DIAL_BG)));
} else {
Toast.makeText(mContext,
getResources().getString(R.string.find_no_sdcard),
Toast.LENGTH_LONG).show();
}
break;
case RESULT_REQUEST_CODE:
break;
case CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE:
CropImage.ActivityResult result = CropImage.getActivityResult(data);
Uri resultUri = result.getUri();
Log.i("sss", "自定义裁剪工具 result=" + result + ",resultUri=" + resultUri);
if (resultUri == null) {
return;
}else {
// fragment_hello1.setImageURI(resultUri);
Log.d("输出的","8");
}
BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inPreferredConfig = Bitmap.Config.RGB_565;
bm = BitmapFactory.decodeFile(resultUri.getPath(), options2);
@SuppressLint("WrongConstant") SharedPreferences sharedPreferences = getSharedPreferences("PersonalInforMation", Context.MODE_APPEND);
SharedPreferences.Editor editor= sharedPreferences.edit();
editor.putString("HeadPortraits",""+resultUri.getPath());
editor.commit();
//(circleBitmapByShader(bm,240,120));
// fragment_hello1.setImageBitmap(circleBitmapByShader(bm,240,120));
if (bm == null) {
return;
}else {
Log.d("输出的","8"+bm);
fragment_hello1.setImageBitmap(circleBitmapByShader(bm,240,120));
}
String uu = sharedPreferences.getString("HeadPortraits","");
Uri uri = Uri.parse(uu);
Log.d("赛季初3",bm+"-"+uu+options2+uri);
if (uu.equals("")) {
Log.d("赛季初","0--"+uu+"---"+bm+"-"+uri);
return;
}else {
Log.d("赛季初2", "99" + (circleBitmapByShader(bm, 240, 120)));
fragment_hello1.setImageBitmap(circleBitmapByShader(bm, 240, 120));
}
Log.i("sss", "自定义裁剪工具 bm.getWidth()=" + bm.getWidth() + "*" + bm.getHeight());
// if (bm.getWidth() == corpWidth && bm.getHeight() == corpHeigth) {//出现过截取得到的是239*239,导致闪退
// changeBgToByte(bm);//defaultData在这个方法里面重新赋值
// }
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
DialSelectPicDialog.java
package com.skinod.clocfit.ui.dialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.TextView;
import com.skinod.clocfit.R;
public class DialSelectPicDialog extends Dialog implements View.OnClickListener {
private final static String TAG = "BodySelectDialog";
public DialSelectPicDialog(Context context) {
super(context);
}
public DialSelectPicDialog(Context context, int theme) {
super(context, theme);
}
@Override
public void onClick(View v) {
}
public static class Builder {
private Context context;
private TextView photo, albumon;
private Button cancel;
private OnClickListener albumonClickListener;
private OnClickListener photoClickListener;
private OnClickListener cancelClickListener;
public Builder(Context context) {
this.context = context;
}
public Builder setPhotoButton(OnClickListener listener) {
this.photoClickListener = listener;
return this;
}
public Builder setAlbumonButton(OnClickListener listener) {
this.albumonClickListener = listener;
return this;
}
public Builder setCancelButton(OnClickListener listener) {
this.cancelClickListener = listener;
return this;
}
DialSelectPicDialog dialog;
public DialSelectPicDialog create() {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
dialog = new DialSelectPicDialog(context, R.style.BottomAnimDialogStyle);
View layout = inflater.inflate(R.layout.device_the_dial_set_dial_select_pic_dialog,
null);
dialog.addContentView(layout, new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT));
photo = layout.findViewById(R.id.photo);
albumon = layout.findViewById(R.id.albumon);
cancel = layout.findViewById(R.id.cancel);
if (photoClickListener != null) {
photo.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
photoClickListener.onClick(dialog,
DialogInterface.BUTTON_POSITIVE);
}
});
}
if (albumonClickListener != null) {
albumon.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
albumonClickListener.onClick(dialog,
DialogInterface.BUTTON_NEGATIVE);
}
});
}
if (cancelClickListener != null) {
cancel.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
cancelClickListener.onClick(dialog,
DialogInterface.BUTTON_NEGATIVE);
}
});
}
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
dialog.setContentView(layout);
return dialog;
}
public boolean isShowing() {
return dialog.isShowing();
}
}
}