android-[IM]-仿微信聊天界面图片显示

baidu_29096973 2015-08-24 10:42:34


求大神告知微信聊天页面 这个图片是怎么实现的呢 图片自带个小三角,和图片的颜色是一致的,我大概知道可能是在上面添加了一个边框,覆盖了一部分,或者是裁切了一部分。到底怎么实现起来比较容易呢~
...全文
9033 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
A_mnesia 2017-07-18
  • 打赏
  • 举报
回复
楼主发一份dome给我呗 万分感谢547161436QQ.com
德星 2017-06-09
  • 打赏
  • 举报
回复
https://github.com/baoyongzhang/BubbleImageView
24K纯bug 2017-04-24
  • 打赏
  • 举报
回复
楼主发一份完成的demo吧
  • 打赏
  • 举报
回复
谢谢楼主以及楼上的兄弟!
柯基摇屁股 2016-12-06
  • 打赏
  • 举报
回复
引用 25 楼 Androidrookie 的回复:
楼主还在吗? 你那个类里用到的几个R.styleable 属性告知一下吗?
你可以去 看看这个https://github.com/angeldevil/ChatImageView
Androidrookie 2016-11-09
  • 打赏
  • 举报
回复
引用 24 楼 baidu_29096973 的回复:
android:id="@+id/iv_picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="@dimen/dp5" android:layout_marginLeft="@dimen/dp5" android:layout_below="@+id/from_name" app:bubble_arrowTop="15dp" app:bubble_angle="10dp" app:bubble_arrowOffset="-5dp" app:bubble_arrowHeight="10dp" app:bubble_arrowWidth="5dp" android:adjustViewBounds="true" android:padding="0dp" android:src="@drawable/empty_photosmile" android:maxWidth="@dimen/dp150" android:maxHeight="@dimen/dp150" android:minHeight="@dimen/dp100" android:minWidth="@dimen/dp120" android:scaleType="fitXY"> 这是我用的属性
楼主R.styleable 属性我自己加上了,我用你这个属性写了一个IMageView可是将 android:src="@drawable/empty_photosmile" 这里改成自己的图片放进去现在是还是图片原来的样子 = = 能帮忙看下吗?感谢
Androidrookie 2016-11-09
  • 打赏
  • 举报
回复
楼主还在吗? 你那个类里用到的几个R.styleable 属性告知一下吗?
baidu_29096973 2016-09-07
  • 打赏
  • 举报
回复
android:id="@+id/iv_picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="@dimen/dp5" android:layout_marginLeft="@dimen/dp5" android:layout_below="@+id/from_name" app:bubble_arrowTop="15dp" app:bubble_angle="10dp" app:bubble_arrowOffset="-5dp" app:bubble_arrowHeight="10dp" app:bubble_arrowWidth="5dp" android:adjustViewBounds="true" android:padding="0dp" android:src="@drawable/empty_photosmile" android:maxWidth="@dimen/dp150" android:maxHeight="@dimen/dp150" android:minHeight="@dimen/dp100" android:minWidth="@dimen/dp120" android:scaleType="fitXY"> 这是我用的属性
baidu_29096973 2016-09-07
  • 打赏
  • 举报
回复
哎呀 不好意思! 前段时间一直很忙没时间看帖子 就此分享代码和使用方法~ 直接复制用法和IMAGVIEW是一样的 /** * * @author Administrator * 聊天气泡式imageView */ public class BubbleImageView extends ImageView { private static final int LOCATION_LEFT = 0; //箭头方向左 private static final Bitmap.Config BITMAP_CONFIG=Bitmap.Config.RGB_565;//代表16位ARGB位图 private static final int COLORDRAWABLE_DIMENSION=1; private ColorFilter cf; private int mAngle = dp2px(10); private int mArrowTop = dp2px(40); private int mArrowWidth = dp2px(20); private int mArrowHeight = dp2px(20); private int mArrowOffset = 0; private int mArrowLocation = LOCATION_LEFT; private Rect mDrawableRect; private Bitmap mBitmap; private BitmapShader mBitmapShader; private Paint mBitmapPaint; private Matrix mShaderMatrix; private int mBitmapWidth; private int mBitmapHeight; public BubbleImageView(Context context) { super(context); // TODO Auto-generated constructor stub initView(null); } public BubbleImageView(Context context, AttributeSet attrs) { super(context, attrs,0); // TODO Auto-generated constructor stub initView(attrs); } public BubbleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub initView(attrs); } private void initView(AttributeSet attrs) { // TODO Auto-generated method stub if(attrs!=null){ TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.BubbleImageView); mAngle = (int) a.getDimension(R.styleable.BubbleImageView_bubble_angle, mAngle); mArrowHeight = (int) a.getDimension(R.styleable.BubbleImageView_bubble_arrowHeight, mArrowHeight); mArrowOffset = (int) a.getDimension(R.styleable.BubbleImageView_bubble_arrowOffset, mArrowOffset); mArrowTop = (int) a.getDimension(R.styleable.BubbleImageView_bubble_arrowTop, mArrowTop); mArrowWidth = (int) a.getDimension(R.styleable.BubbleImageView_bubble_arrowWidth, mAngle); mArrowLocation = a.getInt(R.styleable.BubbleImageView_bubble_arrowLocation, mArrowLocation); a.recycle(); } } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub if (getDrawable() == null) { return; } RectF rect = new RectF(getPaddingLeft(), getPaddingTop(), getRight() - getLeft() - getPaddingRight(), getBottom() - getTop() - getPaddingBottom()); Path path = new Path(); if (mArrowLocation == LOCATION_LEFT) { leftPath(rect, path); } else { rightPath(rect, path); } canvas.drawPath(path, mBitmapPaint); } private void rightPath(RectF rect, Path path) { // TODO Auto-generated method stub path.moveTo(mAngle, rect.top); path.lineTo(rect.width(), rect.top); path.arcTo(new RectF(rect.right - mAngle * 2 - mArrowWidth, rect.top, rect.right - mArrowWidth, mAngle * 2 + rect.top), 270, 90); path.lineTo(rect.right - mArrowWidth, mArrowTop); path.lineTo(rect.right, mArrowTop - mArrowOffset); path.lineTo(rect.right - mArrowWidth, mArrowTop + mArrowHeight); path.lineTo(rect.right - mArrowWidth, rect.height() - mAngle); path.arcTo(new RectF(rect.right - mAngle * 2 - mArrowWidth, rect.bottom - mAngle * 2, rect.right - mArrowWidth, rect.bottom), 0, 90); path.lineTo(rect.left, rect.bottom); path.arcTo(new RectF(rect.left, rect.bottom - mAngle * 2, mAngle * 2 + rect.left, rect.bottom), 90, 90); path.lineTo(rect.left, rect.top); path.arcTo(new RectF(rect.left, rect.top, mAngle * 2 + rect.left, mAngle * 2 + rect.top), 180, 90); path.close(); } private void leftPath(RectF rect, Path path) { // TODO Auto-generated method stub path.moveTo(mAngle + mArrowWidth, rect.top); path.lineTo(rect.width(), rect.top); path.arcTo(new RectF(rect.right - mAngle * 2, rect.top, rect.right, mAngle * 2 + rect.top), 270, 90); path.lineTo(rect.right, rect.top); path.arcTo(new RectF(rect.right - mAngle * 2, rect.bottom - mAngle * 2, rect.right, rect.bottom), 0, 90); path.lineTo(rect.left + mArrowWidth, rect.bottom); path.arcTo(new RectF(rect.left + mArrowWidth, rect.bottom - mAngle * 2, mAngle * 2 + rect.left + mArrowWidth, rect.bottom), 90, 90); path.lineTo(rect.left + mArrowWidth, mArrowTop + mArrowHeight); path.lineTo(rect.left, mArrowTop - mArrowOffset); path.lineTo(rect.left + mArrowWidth, mArrowTop); path.lineTo(rect.left + mArrowWidth, rect.top); path.arcTo(new RectF(rect.left + mArrowWidth, rect.top, mAngle * 2 + rect.left + mArrowWidth, mAngle * 2 + rect.top), 180, 90); path.close(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); setup(); } @Override public void setImageBitmap(Bitmap bm) { super.setImageBitmap(bm); mBitmap = bm; setup(); } @Override public void setImageDrawable(Drawable drawable) { super.setImageDrawable(drawable); mBitmap = getBitmapFromDrawable(drawable); setup(); } @Override public void setImageResource(int resId) { super.setImageResource(resId); mBitmap = getBitmapFromDrawable(getDrawable()); setup(); } private Bitmap getBitmapFromDrawable(Drawable drawable) { if (drawable == null) { return null; } if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } try { Bitmap bitmap; if (drawable instanceof ColorDrawable) { bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG); } else { bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; } catch (OutOfMemoryError e) { return null; } } private void setup() { if (mBitmap == null) { return; } mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mBitmapPaint = new Paint(); if (cf != null) { mBitmapPaint.setColorFilter(cf); } mBitmapPaint.setAntiAlias(true); mBitmapPaint.setShader(mBitmapShader); mBitmapHeight = mBitmap.getHeight(); mBitmapWidth = mBitmap.getWidth(); updateShaderMatrix(); invalidate(); } public void setColorFilter(ColorFilter cf) { this.cf = cf; } private void updateShaderMatrix() { float scale; float dx = 0; float dy = 0; mShaderMatrix = new Matrix(); mShaderMatrix.set(null); mDrawableRect = new Rect(0, 0, getRight() - getLeft(), getBottom() - getTop()); if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) { scale = mDrawableRect.height() / (float) mBitmapHeight; dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f; } else { scale = mDrawableRect.width() / (float) mBitmapWidth; dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f; } mShaderMatrix.setScale(scale, scale); mShaderMatrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f)); mBitmapShader.setLocalMatrix(mShaderMatrix); } private int dp2px(int dp) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getContext().getResources().getDisplayMetrics()); } }
柯基摇屁股 2016-08-02
  • 打赏
  • 举报
回复
引用 20 楼 whf769 的回复:
[quote=引用 19 楼 whf769 的回复:] [quote=引用 18 楼 wxm1225929690 的回复:] [quote=引用 17 楼 whf769 的回复:] [quote=引用 16 楼 wxm1225929690 的回复:] https://github.com/nicewarm/WeChatImageClipping 大家可以去看看这个 应该是你们想要的 楼主不留方法也是醉了
有 eclipse的 Demo版本吗? [/quote]这个就是eclipse的demo版本啊 代码很简单 我去看了下就是一个Activity public class MainActivity extends Activity { private ImageView iv_image; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv_image = (ImageView) findViewById(R.id.iv_image); showImage(); } private void showImage(){ new Thread(new Runnable() { @Override public void run() { Bitmap bitmap_bg = BitmapFactory.decodeResource(getResources(), R.drawable.chat_adapter_to_bg); Bitmap bitmap_in = BitmapFactory.decodeResource(getResources(), R.drawable.aa); final Bitmap bp = getRoundCornerImage(bitmap_bg, bitmap_in); final Bitmap bp2 = getShardImage(bitmap_bg, bp); runOnUiThread(new Runnable() { @Override public void run() { iv_image.setImageBitmap(bp2); } }); } }).start(); } public static Bitmap getRoundCornerImage(Bitmap bitmap_bg,Bitmap bitmap_in) { Bitmap roundConcerImage = Bitmap.createBitmap(500,500, Config.ARGB_8888); Canvas canvas = new Canvas(roundConcerImage); Paint paint = new Paint(); Rect rect = new Rect(0,0,500,500); Rect rectF = new Rect(0, 0, bitmap_in.getWidth(), bitmap_in.getHeight()); paint.setAntiAlias(true); NinePatch patch = new NinePatch(bitmap_bg, bitmap_bg.getNinePatchChunk(), null); patch.draw(canvas, rect); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap_in, rectF, rect, paint); return roundConcerImage; } public static Bitmap getShardImage(Bitmap bitmap_bg,Bitmap bitmap_in) { Bitmap roundConcerImage = Bitmap.createBitmap(500,500, Config.ARGB_8888); Canvas canvas = new Canvas(roundConcerImage); Paint paint = new Paint(); Rect rect = new Rect(0,0,500,500); paint.setAntiAlias(true); NinePatch patch = new NinePatch(bitmap_bg, bitmap_bg.getNinePatchChunk(), null); patch.draw(canvas, rect); Rect rect2 = new Rect(2,2,498,498); canvas.drawBitmap(bitmap_in, rect, rect2, paint); return roundConcerImage; } } [/quote] 微信没有外边框, 这个有个边框[/quote]边框是可以去掉的,具体的怎么做的不记得了,我也试过去掉边框的
java_carson 2016-05-04
  • 打赏
  • 举报
回复
楼主解决了吗?解决的话能发我一份吗,625182111@qq.com
whf769 2016-03-22
  • 打赏
  • 举报
回复
引用 19 楼 whf769 的回复:
[quote=引用 18 楼 wxm1225929690 的回复:] [quote=引用 17 楼 whf769 的回复:] [quote=引用 16 楼 wxm1225929690 的回复:] https://github.com/nicewarm/WeChatImageClipping 大家可以去看看这个 应该是你们想要的 楼主不留方法也是醉了
有 eclipse的 Demo版本吗? [/quote]这个就是eclipse的demo版本啊 代码很简单 我去看了下就是一个Activity public class MainActivity extends Activity { private ImageView iv_image; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv_image = (ImageView) findViewById(R.id.iv_image); showImage(); } private void showImage(){ new Thread(new Runnable() { @Override public void run() { Bitmap bitmap_bg = BitmapFactory.decodeResource(getResources(), R.drawable.chat_adapter_to_bg); Bitmap bitmap_in = BitmapFactory.decodeResource(getResources(), R.drawable.aa); final Bitmap bp = getRoundCornerImage(bitmap_bg, bitmap_in); final Bitmap bp2 = getShardImage(bitmap_bg, bp); runOnUiThread(new Runnable() { @Override public void run() { iv_image.setImageBitmap(bp2); } }); } }).start(); } public static Bitmap getRoundCornerImage(Bitmap bitmap_bg,Bitmap bitmap_in) { Bitmap roundConcerImage = Bitmap.createBitmap(500,500, Config.ARGB_8888); Canvas canvas = new Canvas(roundConcerImage); Paint paint = new Paint(); Rect rect = new Rect(0,0,500,500); Rect rectF = new Rect(0, 0, bitmap_in.getWidth(), bitmap_in.getHeight()); paint.setAntiAlias(true); NinePatch patch = new NinePatch(bitmap_bg, bitmap_bg.getNinePatchChunk(), null); patch.draw(canvas, rect); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap_in, rectF, rect, paint); return roundConcerImage; } public static Bitmap getShardImage(Bitmap bitmap_bg,Bitmap bitmap_in) { Bitmap roundConcerImage = Bitmap.createBitmap(500,500, Config.ARGB_8888); Canvas canvas = new Canvas(roundConcerImage); Paint paint = new Paint(); Rect rect = new Rect(0,0,500,500); paint.setAntiAlias(true); NinePatch patch = new NinePatch(bitmap_bg, bitmap_bg.getNinePatchChunk(), null); patch.draw(canvas, rect); Rect rect2 = new Rect(2,2,498,498); canvas.drawBitmap(bitmap_in, rect, rect2, paint); return roundConcerImage; } } [/quote] 微信没有外边框, 这个有个边框
whf769 2016-03-21
  • 打赏
  • 举报
回复
引用 18 楼 wxm1225929690 的回复:
[quote=引用 17 楼 whf769 的回复:]
[quote=引用 16 楼 wxm1225929690 的回复:]
https://github.com/nicewarm/WeChatImageClipping 大家可以去看看这个 应该是你们想要的 楼主不留方法也是醉了



有 eclipse的 Demo版本吗?

[/quote]这个就是eclipse的demo版本啊 代码很简单 我去看了下就是一个Activity

public class MainActivity extends Activity {

private ImageView iv_image;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_image = (ImageView) findViewById(R.id.iv_image);
showImage();
}

private void showImage(){
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap_bg = BitmapFactory.decodeResource(getResources(), R.drawable.chat_adapter_to_bg);
Bitmap bitmap_in = BitmapFactory.decodeResource(getResources(), R.drawable.aa);
final Bitmap bp = getRoundCornerImage(bitmap_bg, bitmap_in);
final Bitmap bp2 = getShardImage(bitmap_bg, bp);
runOnUiThread(new Runnable() {
@Override
public void run() {
iv_image.setImageBitmap(bp2);
}
});
}
}).start();
}

public static Bitmap getRoundCornerImage(Bitmap bitmap_bg,Bitmap bitmap_in)
{
Bitmap roundConcerImage = Bitmap.createBitmap(500,500, Config.ARGB_8888);
Canvas canvas = new Canvas(roundConcerImage);
Paint paint = new Paint();
Rect rect = new Rect(0,0,500,500);
Rect rectF = new Rect(0, 0, bitmap_in.getWidth(), bitmap_in.getHeight());
paint.setAntiAlias(true);
NinePatch patch = new NinePatch(bitmap_bg, bitmap_bg.getNinePatchChunk(), null);
patch.draw(canvas, rect);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap_in, rectF, rect, paint);
return roundConcerImage;
}
public static Bitmap getShardImage(Bitmap bitmap_bg,Bitmap bitmap_in)
{
Bitmap roundConcerImage = Bitmap.createBitmap(500,500, Config.ARGB_8888);
Canvas canvas = new Canvas(roundConcerImage);
Paint paint = new Paint();
Rect rect = new Rect(0,0,500,500);
paint.setAntiAlias(true);
NinePatch patch = new NinePatch(bitmap_bg, bitmap_bg.getNinePatchChunk(), null);
patch.draw(canvas, rect);
Rect rect2 = new Rect(2,2,498,498);
canvas.drawBitmap(bitmap_in, rect, rect2, paint);
return roundConcerImage;
}
}
[/quote]

OK, 多谢
柯基摇屁股 2016-03-18
  • 打赏
  • 举报
回复
https://github.com/nicewarm/WeChatImageClipping 大家可以去看看这个 应该是你们想要的 楼主不留方法也是醉了
whf769 2016-03-18
  • 打赏
  • 举报
回复
你好 , 是怎么显示 的
柯基摇屁股 2016-03-18
  • 打赏
  • 举报
回复
引用 17 楼 whf769 的回复:
[quote=引用 16 楼 wxm1225929690 的回复:] https://github.com/nicewarm/WeChatImageClipping 大家可以去看看这个 应该是你们想要的 楼主不留方法也是醉了
有 eclipse的 Demo版本吗? [/quote]这个就是eclipse的demo版本啊 代码很简单 我去看了下就是一个Activity public class MainActivity extends Activity { private ImageView iv_image; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv_image = (ImageView) findViewById(R.id.iv_image); showImage(); } private void showImage(){ new Thread(new Runnable() { @Override public void run() { Bitmap bitmap_bg = BitmapFactory.decodeResource(getResources(), R.drawable.chat_adapter_to_bg); Bitmap bitmap_in = BitmapFactory.decodeResource(getResources(), R.drawable.aa); final Bitmap bp = getRoundCornerImage(bitmap_bg, bitmap_in); final Bitmap bp2 = getShardImage(bitmap_bg, bp); runOnUiThread(new Runnable() { @Override public void run() { iv_image.setImageBitmap(bp2); } }); } }).start(); } public static Bitmap getRoundCornerImage(Bitmap bitmap_bg,Bitmap bitmap_in) { Bitmap roundConcerImage = Bitmap.createBitmap(500,500, Config.ARGB_8888); Canvas canvas = new Canvas(roundConcerImage); Paint paint = new Paint(); Rect rect = new Rect(0,0,500,500); Rect rectF = new Rect(0, 0, bitmap_in.getWidth(), bitmap_in.getHeight()); paint.setAntiAlias(true); NinePatch patch = new NinePatch(bitmap_bg, bitmap_bg.getNinePatchChunk(), null); patch.draw(canvas, rect); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap_in, rectF, rect, paint); return roundConcerImage; } public static Bitmap getShardImage(Bitmap bitmap_bg,Bitmap bitmap_in) { Bitmap roundConcerImage = Bitmap.createBitmap(500,500, Config.ARGB_8888); Canvas canvas = new Canvas(roundConcerImage); Paint paint = new Paint(); Rect rect = new Rect(0,0,500,500); paint.setAntiAlias(true); NinePatch patch = new NinePatch(bitmap_bg, bitmap_bg.getNinePatchChunk(), null); patch.draw(canvas, rect); Rect rect2 = new Rect(2,2,498,498); canvas.drawBitmap(bitmap_in, rect, rect2, paint); return roundConcerImage; } }
whf769 2016-03-18
  • 打赏
  • 举报
回复
引用 16 楼 wxm1225929690 的回复:
https://github.com/nicewarm/WeChatImageClipping 大家可以去看看这个 应该是你们想要的 楼主不留方法也是醉了
有 eclipse的 Demo版本吗?
xue13643592139 2016-03-04
  • 打赏
  • 举报
回复
给我也来一份.xue13643592139@163.com
  • 打赏
  • 举报
回复
楼主解决了吗?解决的话能发我一份吗,395021933@qq.com
小冰冰 2015-11-27
  • 打赏
  • 举报
回复
楼主现在还看帖子嘛?求解决方法379055048@qq.com
加载更多回复(11)
本项目是一个基于安卓的Android仿微信客户端-猫友。是一个csdn上的朋友的原创项目,原帖可以看这里http://blog.csdn.net/ericfantastic/article/details/49451249 实现了微信的登录注册、主界面聊天会话、通讯录、发现界面、个人设置、添加好友、扫描二维码、视频通话、等所有基本功能。 下面是具体搭建方法: 1、下载Openfire的安装包:http://download.csdn.net/detail/ericfantastic/9219685 Openfire服务器及MySQL具体配置可以参考:http://www.th7.cn/db/mysql/201406/59838.shtml 2、建议下载Openfire自带的PC客户端Spark,方便测试功能:http://download.csdn.net/detail/ericfantastic/9219815 3、修改源码中的服务器主机地址:在ConnetServer.java中,修改Configuration为本地的IP地址。 4、修改添加好友中的JID主机名:在AddFriendActivity.java中,修改addFriend方法中的"@ericwork-pc"修改为服务器的主机名,不区分大小写; 5、修改聊天页面中的JID主机名:在ChatActivity.java中,修改发送按钮的监听事件中的"@ericwork-pc",同上。 实现一个IM实时聊天应用,少不了弄服务器,目前开源的Openfire服务器就比较合适,而且很多功能都已经封装好了,实现聊天APP就简洁很多。服务器后端的数据库我选择了MySQL,当然Openfire也支持大部分的主流数据库,只要在配置的时候修改好参数即可;搭建的时候,把服务器配到8G内存笔记本上,网上得知,Openfire每个线程大约占4k内存,那理论上是可以80w 用户,当然实际肯定没那么多,Openfire在一台8G的主流服务器上支持30W的用户肯定没有问题。 简单说明一下Eric_JQM_Chat工程目录结构,当初开发的时候初衷只是玩玩openfire实现IM的过程,没想到一写就写了一通,对模块也没有很好的分包,还请多多包涵。 可以脸红的说,基本上所有功能实现都放在第一个eric_jqm_chat包里了,第二个Service包主要放与于后台服务相关的包,但后来这些服务我也都没有启用,后面的四个Zxing包就是实现二维码扫描的包,具体如何实现我的博客里有介绍。 Login登录相关,包括保存当前登录账号密码,下次直接登录使用等功能; Register注册相关,包括本地输入校验; MainActivity主界面相关,包含四个Fragment页面、上方Actionbar及下方的自定义View选项; TabFragment会话界面,用于接收收到的所有消息,并统计条目; TabFragment2通讯录界面,加载用户的好友列表; TabFragment3发现界面,功能尚未添加; TabFragment4个人设置页面,加载个人资料; AddFriendActivity添加好友页面,搜索仅仅是获取用户头像,申请添加好友,及接受好友添加请求并处理; CaptureActivity扫描二维码页面,扫描二维码功能; CatchCameraActivity视频通话页面,仅完成获取前置摄像头预览及获取网络RTSP视频流播放; ConnetServer连接服务器类,单例模式; FormatTools简单工具类,用于各种类型数据间的转换; ChatActivity聊天页面,实现指定好友的聊天功能,及聊天记录的保存; FriendDetail聊天好友详情页面,更改聊天背景等; 主要的类就是这些,具体的详细实现大家可以直接看代码,注释写的很详细了,有疑问的欢迎交流,存在bug还请指正。

80,357

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧