android关于表情图片复制与粘贴

来源:互联网 发布:一个人能备案几个域名 编辑:程序博客网 时间:2024/05/27 09:47
最近遇到一个问题就是表情图片的确是追加到edittext中了,但是当你点击复制或者剪切然后粘贴的时候,理论上是将表情进行粘贴,而事实我的测试的结果是,将图片的内存地址粘贴上去了(一堆整数)。不知道别人遇到没有反正我是遇见了。
先说下表情是如何追加到editext中:
1.追加表情到edittext中:遇到两种问题1.有一种方式追加图片的方式追加成功但是在分辨率高的手机上显示的表情特别小 (采用的是bitmap这种方式) 2.另外这种就是在追加图片的过程中,当未输入字体时,出现追加的图片不完整,总是遮住表情上面一小部分,,当输入字体时表情就会正常,具体的原因没有仔细研究 (这种写法忘记了)。
解决办法: 
说下第一种方式吧 
            
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();bitmapOptions.inSampleSize =1;Bitmap bitmap = BitmapFactory.decodeResource(getResources(),faceid, bitmapOptions);//  根据Bitmap对象创建ImageSpan对象ImageSpan imageSpan = new ImageSpan(bitmap);//  创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像SpannableString text = new SpannableString(faceid + "");//  用ImageSpan对象替换facetext.setSpan(imageSpan, 0, (faceid + "").length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);et_text.append(text);

通过这种方式写追加图片得到的图片显示在edittext中会非常小,你可以通过手机的尺寸将这个表情图进行伸缩你想要的尺寸
提示:(我是采取这种方式设置的表情,你可以采用其他的)
               
// 取得想要缩放的matrix参数Matrix matrix = new Matrix();matrix.postScale(scaleWidth, scaleHeight);// 得到新的图片 Bitmap newbm = Bitmap.createBitmap(bitmap, 0, 0,width,width, matrix,true);



2.edittext中表情的复制、剪切和粘贴:遇到的问题:接着上面说,因为我添加的表情是采取追加的方式才能显示在edittext中,所以在图片的复制粘贴就会出现一系列的问题:
        1.粘贴的表情是内存地址
        2.表情和文本混排时错位
        3.复制粘贴表情时,不是粘贴在光标指定的位置粘贴,而是总是在最后添加表情


        解决办法:
        重写edittext中的onTextContextMenuItem()这个方法,我只是在粘贴上面做了写手脚,就是过滤粘贴的内容,将粘贴内容中的对应的图片地址替换上面追加图片的方式,然后定位到光标出现的位置,对你想要的位置进行粘贴。由于我观察了很多的图片地址信息,所以我这里的表情图片输入的地址一般是这样的:2130837526、2130837527、2130837584,这种格式,当然可能你的有些不同,但都差不多。我这里的表情名称是f0.gif、f1.gif等等这种形式命名,是有规律的,你在命名表情也应该是有规律的命名。你可以观察你的多个表情地址。改下就好了。
        重要代码如下:

      
  @Override        public boolean onTextContextMenuItem(int id) {                // 获取系统剪切板                ClipboardManager clip = (ClipboardManager) BaseApp.mContext.getSystemService(Context.CLIPBOARD_SERVICE);                Log.e("clip", clip.getText().toString());                switch (id) {                case 16908322: // 粘贴                //((Editable) mText).replace(min, max, clip.getText().toString());                getPic(clip.getText().toString());                return true;            }              return super.onTextContextMenuItem(id);    }/*** 将带表情的字符串格式化* * @param str(获取的粘贴的内容)* @return*/            public void getPic(String str) {            int selStart = getSelectionStart();            int selEnd = getSelectionEnd();                Log.e("selStart :selEnd", selStart+":"+selEnd);            String[] faces = str.split("2130837");            String start = "";            String face = "";            String end = "";            for (int i = 0; i < faces.length; i++) {            Log.e("faceid", "213" + faces[i] + "");            if (str.contains("2130837") && str.length()>=10) {                    start = str.substring(0, str.indexOf("213")) + "";                    face = str.substring(str.indexOf("213"),str.indexOf("213") + 10);                    end = str.substring(str.indexOf("213") + 10, str.length()) + "";                    getText().insert(getSelectionStart(), start);//在对应的位置插入文本                    getText().insert(getSelectionStart(), getFace(Integer.parseInt(face)));//在对应的位置插入表情                                //getFace()是上面所介绍的将图片转化成文本的形式进行追加图片 返回值SpannableString                     str = end;                }else{                        getText().insert(getSelectionStart(), str);                        //append(str);                }        }               faces=null;      }

        上面的getFace()方法可能有点笨了点,但是还好能用。 
        
        好了,这个问题终于被我解决掉了。记录下方便我以后看。
2 0
原创粉丝点击