看贴吧的时候觉得跟帖的时候的图文共存方式写的不错
自己就查了些资料简单写写
当然没有百度贴吧的大神写的好
各位简单看看
首先根据图片路径压缩 ,返回bitmap用于显示 ,并且把图片缩小三分之二,具体展示多大,各位自己定
public Bitmap getSmallBitmap(String filePath, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeFile(filePath, options); DisplayMetrics dm = mContext.getResources().getDisplayMetrics(); int w_screen = dm.widthPixels; int w_width = w_screen/3; int b_width = bitmap.getWidth(); int b_height = bitmap.getHeight(); int w_height = w_screen * b_height / b_width/3; // int w_height = w_width * b_height / b_width; bitmap = Bitmap.createScaledBitmap(bitmap, w_width, w_height, false); return bitmap; }
计算图片缩放值
public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; }
大概这样
插入图片
private SpannableString insertBitmap(String path, Bitmap bitmap) { Editable edit_text = getEditableText(); int index = getSelectionStart(); // 获取光标所在位置 //插入换行符,使图片单独占一行 SpannableString newLine = new SpannableString("\n"); edit_text.insert(index, newLine);//插入图片前换行 // 创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像 path = mBitmapTag + path + mBitmapTag; SpannableString spannableString = new SpannableString(path); // 根据Bitmap对象创建ImageSpan对象 ImageSpan imageSpan = new ImageSpan(mContext, bitmap); // 用ImageSpan对象替换你指定的字符串 spannableString.setSpan(imageSpan, 0, path.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 将选择的图片追加到EditText中光标所在位置 if (index < 0 || index >= edit_text.length()) { edit_text.append(spannableString); } else { edit_text.insert(index, spannableString); } edit_text.insert(index, newLine);//插入图片后换行 return spannableString; }
设置数据
private void insertData() { if (mContentList.size() > 0) { for (String str : mContentList) { if (str.indexOf(mBitmapTag) != -1) {//判断是否是图片地址 String path = str.replace(mBitmapTag, "");//还原地址字符串 Bitmap bitmap = getSmallBitmap(path, 480, 800); //插入图片 insertBitmap(path, bitmap); } else { //插入文字 SpannableString ss = new SpannableString(str); append(ss); } } } }
用集合的形式获取控件的内容
public List<String> getmContentList() { if (mContentList == null) { mContentList = new ArrayList<String>(); } String content = getText().toString().replaceAll(mNewLineTag, ""); if (content.length() > 0 && content.contains(mBitmapTag)) { String[] split = content.split("☆"); mContentList.clear(); for (String str : split) { mContentList.add(str); } } else { mContentList.add(content); } return mContentList; } float oldY = 0; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: oldY = event.getY(); requestFocus(); break; case MotionEvent.ACTION_MOVE: float newY = event.getY(); if (Math.abs(oldY - newY) > 20) { clearFocus(); } break; case MotionEvent.ACTION_UP: break; default: break; } return super.onTouchEvent(event); }
/** * 插入图片 * * @param path */ public void insertBitmap(String path) { Bitmap bitmap = getSmallBitmap(path, 480, 800); insertBitmap(path, bitmap); }
下面把完整代码贴一下
/** * Created by ly on 17/6/16. * 图文混排编辑器 */ public class PictureTextEditorView extends EditText { private final String TAG = "PictureTextEditorView"; private Context mContext; private List<String> mContentList; public static final String mBitmapTag = "☆"; private String mNewLineTag = "\n"; public PictureTextEditorView(Context context) { super(context); init(context); } public PictureTextEditorView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public PictureTextEditorView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private void init(Context context) { mContext = context; mContentList = getmContentList(); insertData(); } // 根据路径获得图片并压缩,返回bitmap用于显示 public Bitmap getSmallBitmap(String filePath, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeFile(filePath, options); DisplayMetrics dm = mContext.getResources().getDisplayMetrics(); int w_screen = dm.widthPixels; int w_width = w_screen/3; int b_width = bitmap.getWidth(); int b_height = bitmap.getHeight(); int w_height = w_screen * b_height / b_width/3; // int w_height = w_width * b_height / b_width; bitmap = Bitmap.createScaledBitmap(bitmap, w_width, w_height, false); return bitmap; } //计算图片的缩放值 public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; } /** * 插入图片 * * @param bitmap * @param path * @return */ private SpannableString insertBitmap(String path, Bitmap bitmap) { Editable edit_text = getEditableText(); int index = getSelectionStart(); // 获取光标所在位置 //插入换行符,使图片单独占一行 SpannableString newLine = new SpannableString("\n"); edit_text.insert(index, newLine);//插入图片前换行 // 创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像 path = mBitmapTag + path + mBitmapTag; SpannableString spannableString = new SpannableString(path); // 根据Bitmap对象创建ImageSpan对象 ImageSpan imageSpan = new ImageSpan(mContext, bitmap); // 用ImageSpan对象替换你指定的字符串 spannableString.setSpan(imageSpan, 0, path.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 将选择的图片追加到EditText中光标所在位置 if (index < 0 || index >= edit_text.length()) { edit_text.append(spannableString); } else { edit_text.insert(index, spannableString); } edit_text.insert(index, newLine);//插入图片后换行 return spannableString; } /** * 设置数据 */ private void insertData() { if (mContentList.size() > 0) { for (String str : mContentList) { if (str.indexOf(mBitmapTag) != -1) {//判断是否是图片地址 String path = str.replace(mBitmapTag, "");//还原地址字符串 Bitmap bitmap = getSmallBitmap(path, 480, 800); //插入图片 insertBitmap(path, bitmap); } else { //插入文字 SpannableString ss = new SpannableString(str); append(ss); } } } } /** * 用集合的形式获取控件里的内容 * * @return */ public List<String> getmContentList() { if (mContentList == null) { mContentList = new ArrayList<String>(); } String content = getText().toString().replaceAll(mNewLineTag, ""); if (content.length() > 0 && content.contains(mBitmapTag)) { String[] split = content.split("☆"); mContentList.clear(); for (String str : split) { mContentList.add(str); } } else { mContentList.add(content); } return mContentList; } float oldY = 0; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: oldY = event.getY(); requestFocus(); break; case MotionEvent.ACTION_MOVE: float newY = event.getY(); if (Math.abs(oldY - newY) > 20) { clearFocus(); } break; case MotionEvent.ACTION_UP: break; default: break; } return super.onTouchEvent(event); } /** * 插入图片 * * @param path */ public void insertBitmap(String path) { Bitmap bitmap = getSmallBitmap(path, 480, 800); insertBitmap(path, bitmap); } }
Activity 类
public class EditActivity extends Activity { private static final int LOCAL_IMAGE_CODE = 888; private PictureTextEditorView mEditText; private Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_edit); mEditText = (PictureTextEditorView) findViewById(R.id.edit_text); mButton = (Button) findViewById(R.id.button_add_picture); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { selectPicFromLocal(EditActivity.this, 888);//获取手机本地图片的代码,大家可以自行实现 } }); mEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { Log.i("EditActivity", mEditText.getmContentList().toString()); } @Override public void afterTextChanged(Editable s) { } }); } public void selectPicFromLocal(Context mContext, int LOCAL_IMAGE_CODE) { // intent.setType(“image/*”); //选择图片 // intent.setType(“audio/*”); //选择音频 // intent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式) // intent.setType(“video/*;image/*”);//同时选择视频和图片 Intent intent = new Intent(); String IMAGE_TYPE = "image/*"; intent.setType(IMAGE_TYPE); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, LOCAL_IMAGE_CODE); } //4.4之前 public void handleImageBeforeKitKat(Intent data) { Uri uri = data.getData(); String imagePath = getImagePath(uri, null); Log.d("Uri1", imagePath); mEditText.insertBitmap(imagePath); } //4.4之后 @RequiresApi(api = Build.VERSION_CODES.KITKAT) public void handleImageOnKitKat(Intent data) { String imagePath = null; Uri uri = data.getData(); if (DocumentsContract.isDocumentUri(this, uri)) { String docId = DocumentsContract.getDocumentId(uri); if ("com.android.providers.media.documents".equals(uri.getAuthority())) { //解析出数字格式的ID String id = docId.split(":")[1]; //获取相册路径 String selection = MediaStore.Images.Media._ID + "=" + id; imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection); } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) { Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://download/public_downloads"), Long.valueOf(docId)); imagePath = getImagePath(contentUri, null); } } else if ("content".equalsIgnoreCase(uri.getScheme())) { imagePath = getImagePath(uri, null); Log.d("Uri1", imagePath); } mEditText.insertBitmap(imagePath); } private String getImagePath(Uri uri, String selection) { String path = null; Cursor cursor = getContentResolver().query(uri, null, selection, null, null); if (cursor != null) { if (cursor.moveToFirst()) { path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); } cursor.close(); } return path; } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case LOCAL_IMAGE_CODE: if (data != null) { if (resultCode == RESULT_OK) { if (Build.VERSION.SDK_INT >= 19) { handleImageOnKitKat(data); } else { handleImageBeforeKitKat(data); } } } break; default: break; } } } }
5倍缩放效果
作者水平有限 不喜勿喷