实现在edittext中任意插入图片
Myedittext:
public class MyEditText extends EditText {
public MyEditText(Context context) {
super(context);
}
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void insertDrawable(int id) {
final SpannableString ss = new SpannableString("easy");
//得到drawable对象,即所有插入的图片
Drawable d = getResources().getDrawable(id);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
//用这个drawable对象代替字符串easy
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
//包括0但是不包括"easy".length()即:4。[0,4)
ss.setSpan(span, 0, "easy".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
append(ss);
}
}
MyActivity:
public class MyActivity extends Activity {
/** Called when the activity is first created. */
Button b;
MyEditText e;
private static final int PHOTO_SUCCESS = 1;
private static final int CAMERA_SUCCESS = 2;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shangczp);
b = (Button) findViewById(R.id.myButton);
e = (MyEditText) findViewById(R.id.myEdit);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
final CharSequence[] items = { "手机相册", "相机拍摄" };
AlertDialog dlg = new AlertDialog.Builder(MyActivity.this).setTitle("选择图片").setItems(items,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int item) {
//这里item是根据选择的方式,
//在items数组里面定义了两种方式, 拍照的下标为1所以就调用拍照方法
if(item==1){
Intent getImageByCamera= new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(getImageByCamera, CAMERA_SUCCESS);
}else{
Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);
getImage.addCategory(Intent.CATEGORY_OPENABLE);
getImage.setType("image/*");
startActivityForResult(getImage, PHOTO_SUCCESS);
}
}
}).create();
dlg.show();
// e.insertDrawable(R.drawable.easy);
}
});
}
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
ContentResolver resolver = getContentResolver();
if (resultCode == RESULT_OK) {
switch (requestCode) {
case PHOTO_SUCCESS:
//获得图片的uri
Uri originalUri = intent.getData();
Bitmap bitmap = null;
try {
Bitmap originalBitmap = BitmapFactory.decodeStream(resolver.openInputStream(originalUri));
bitmap = resizeImage(originalBitmap, 200, 200);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if(bitmap != null){
//根据Bitmap对象创建ImageSpan对象
ImageSpan imageSpan = new ImageSpan(MyActivity.this, bitmap);
//创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
SpannableString spannableString = new SpannableString("[local]"+1+"[/local]");
// 用ImageSpan对象替换face
spannableString.setSpan(imageSpan, 0, "[local]1[local]".length()+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//将选择的图片追加到EditText中光标所在位置
int index = e.getSelectionStart(); //获取光标所在位置
Editable edit_text = e.getEditableText();
if(index <0 || index >= edit_text.length()){
edit_text.append(spannableString);
}else{
edit_text.insert(index, spannableString);
}
}else{
Toast.makeText(MyActivity.this, "获取图片失败", Toast.LENGTH_SHORT).show();
}
break;
case CAMERA_SUCCESS:
Bundle extras = intent.getExtras();
Bitmap originalBitmap1 = (Bitmap) extras.get("data");
if(originalBitmap1 != null){
bitmap = resizeImage(originalBitmap1, 200, 200);
//根据Bitmap对象创建ImageSpan对象
ImageSpan imageSpan = new ImageSpan(MyActivity.this, bitmap);
//创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
SpannableString spannableString = new SpannableString("[local]"+1+"[/local]");
// 用ImageSpan对象替换face
spannableString.setSpan(imageSpan, 0, "[local]1[local]".length()+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//将选择的图片追加到EditText中光标所在位置
int index = e.getSelectionStart(); //获取光标所在位置
Editable edit_text = e.getEditableText();
if(index <0 || index >= edit_text.length()){
edit_text.append(spannableString);
}else{
edit_text.insert(index, spannableString);
}
}else{
Toast.makeText(MyActivity.this, "获取图片失败", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
}
/**
* 图片缩放
* @param originalBitmap 原始的Bitmap
* @param newWidth 自定义宽度
* @return 缩放后的Bitmap
*/
private Bitmap resizeImage(Bitmap originalBitmap, int newWidth, int newHeight){
int width = originalBitmap.getWidth();
int height = originalBitmap.getHeight();
//定义欲转换成的宽、高
// int newWidth = 200;
// int newHeight = 200;
//计算宽、高缩放率
float scanleWidth = (float)newWidth/width;
float scanleHeight = (float)newHeight/height;
//创建操作图片用的matrix对象 Matrix
Matrix matrix = new Matrix();
// 缩放图片动作
matrix.postScale(scanleWidth,scanleHeight);
//旋转图片 动作
//matrix.postRotate(45);
// 创建新的图片Bitmap
Bitmap resizedBitmap = Bitmap.createBitmap(originalBitmap,0,0,width,height,matrix,true);
return resizedBitmap;
}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <com.example.edittext_pic.MyEditText
android:id="@+id/myEdit"
android:layout_width="fill_parent"
android:layout_height="wrap_content" /> <Button
android:id="@+id/myButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="插入图片" /> </LinearLayout>
实现在edittext中任意插入图片的更多相关文章
- EXCLE中快速插入图片
在excle中怎么快速插入图片呢,一张一张点实在比较麻烦 解决办法: <table><img src="D:\A.png" width="60" ...
- android 在EditText中显示表情图片
public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { su ...
- 【Tips】有道云笔记中Markdown插入图片
在有道云笔记中用MarkDown插入图片 新建一个文档专门用来放图片 把所有要用的图片专门放在一个笔记里,用普通模式先同步笔记,然后用分享笔记 会有一个链接,用浏览器打开这个分享的笔记就能找到所有的图 ...
- 用Java实现在123456789中随机插入+或者-,使表达式的结果为100
这里我的思路是暴力算法.就是不断试错,不限循环次数,直到找到正确的情况为止. 通过走随机,不断控制在123456789中添加+或者-,再通过正则表达式筛选出所有的数字(包含正负),转换为Integer ...
- angularjs中ng-repeat插入图片
<tr ng-repeat="item in datas" ng-module="datas"> <td> <img class ...
- Android图文混排-实现EditText图文混合插入上传
前段时间做了一个Android会议管理系统,项目需求涉及到EditText的图文混排,如图: 在上图的"会议详情"中.须要支持文本和图片的混合插入,下图演示输入的演示样例: 当会议 ...
- C#中按模板操作Word —— 如何向Word中插入图片
一.Word对象模型的重叠性分析 本文主要介绍通过书签Bookmark向Word文档中插入图片的方法.在此之前我们先简单讨论下Word对象模型的重叠性.如果你对Word对象模型还不熟悉,请参考本专栏第 ...
- Office PPT中如何插入flash
1 在"视图"选项中找到工具栏,控件工具箱,最后一个其他工具中的shockwave flash object 2 当鼠标变成十字架之后随便画一个矩形,然后会出现一个白色的矩形中间十 ...
- Android 插入图片到媒体库
今天介绍一下在Android中怎么插入图片到媒体库,下面看代码: final String titleName = Function.md5(imageUri.toLowerCase()) + &qu ...
随机推荐
- 使用Springboot Email实现邮件发送
在springboot配置文件增加emai配置(此种方式不支持QQ邮箱): spring.datasource.type=com.alibaba.druid.pool.DruidDataSource ...
- [置顶] JDK工具(零)--简要介绍JDK1.6自带的42个工具
Java的开发人员肯定都知道JDK的bin目录中有“java.exe”和“javac.exe”这两个命令行工具, 但并非所有的Java程序员都了解过JDK的bin目录之中其它命令行程序的作用. JDK ...
- go语言基础之break和continue的区别
1.break和continue的区别 在循环里面有两个关键操作break和continue,break操作是跳出当前循环,continue是跳过本次循环. 2.break 备注:break可⽤于fo ...
- Tapable 0.2.8 入门
[原文:Tapable 0.2.8 入门] tapable是webpack的核心框架(4.0以上版本的API已经发生了变化),是一个基于事件流的框架,或者叫做发布订阅模式,或观察者模式,webpack ...
- Sql从一张表中更改另一张表数据
语法: update table1 set table1.列=table2.列 from table2 where table2.列=table1.列update dbo.PATIENT se ...
- [Functional Programming] Use Task/Async for Asynchronous Actions
We refactor a standard node callback style workflow into a composed task-based workflow. Original Co ...
- 使用Loader实时查询本地数据库用法
在看Android的文档时,看到了这么一个东西: Loader 究竟是什么东西呢? Introduced in Android 3.0, loaders make it easy to asynchr ...
- <c:redirect>标签的使用
<c:redirect>标签的使用代码例子 redirect.jsp <%@ page contentType="text/html" pageEncoding= ...
- Flutter混合栈的管理
Flutter出现的目的旨在统一Android/IOS两端编程,因此完全基于Flutter开发的App,只需提供一个包含FlutterView的页面,后续页面增加/删除/跳转均在FlutterView ...
- java.sql.SQLException: Data truncation: Truncated incorrect DOUBLE value
mysql 报这个异常:java.sql.SQLException: Data truncation: Truncated incorrect DOUBLE value update 表名 set c ...