android自定义View 之仿QQ消息头像
2014-12-27 10:02
423 查看
在以前开发产品中需要自己 开发 一个 IM功能 所以 头像+消息提示 本来 用图片拼的 现在 我 用自定义View 写了 一个,刚接触 不是很熟悉 ,不足 之处请大家多多指教话不多说上代码
package com.zhl.ziview; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.Toast; public class MyViews extends View { private Paint mPaint;// 画笔 private Rect mRect;// 控件占用的大小 private int mTextSize;// 字体大小 private int mTextColor;// 字体颜色 private String mText;// 字体 public MyViews(Context context) { super(context); // TODO Auto-generated constructor stub } public MyViews(Context context, AttributeSet attrs) { this(context, attrs, 0); // TODO Auto-generated constructor stub } public MyViews(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray mTyarray = context.obtainStyledAttributes(attrs, R.styleable.MyView); int n = mTyarray.getIndexCount(); for (int i = 0; i < n; i++) { int count = mTyarray.getIndex(i); switch (count) { case R.styleable.MyView_text: mText = mTyarray.getString(count); break; case R.styleable.MyView_textColor: // mPaint.setColor(mTyarray.getColor(R.styleable.MyView_textColor, // 0XFF00FF00)); mTextColor = mTyarray.getColor(count, Color.BLUE); break; case R.styleable.MyView_textSize: // mPaint.setTextSize(mTyarray.getDimension( // R.styleable.MyView_textColor, 30)); mTextSize = mTyarray.getDimensionPixelSize(count, R.dimen.text_size); break; default: break; } mTyarray.recycle(); mPaint = new Paint();// 初始化画笔 mRect = new Rect();// 初始化绘制区域 } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub int withmode = MeasureSpec.getMode(widthMeasureSpec); int withsize = MeasureSpec.getSize(widthMeasureSpec); int heightmode = MeasureSpec.getMode(heightMeasureSpec); int heightsize = MeasureSpec.getSize(heightMeasureSpec); int with, height;// 最终大小 if (withmode == MeasureSpec.EXACTLY) { with = withsize; } else { // 获得控件自适应的大小 mPaint.setTextSize(mTextSize); mPaint.getTextBounds(mText, 0, mText.length(), mRect); float textWidth = mRect.width(); int width2 = (int) (getPaddingLeft() + textWidth + getPaddingRight()); with = width2; } if (heightmode == MeasureSpec.EXACTLY) { height = heightsize; } else { mPaint.setTextSize(mTextSize); mPaint.getTextBounds(mText, 0, mText.length(), mRect); float textHeight = mRect.height(); int height2 = (int) (getPaddingTop() + textHeight + getPaddingBottom()); height = height2; } setMeasuredDimension(with, height); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub // mPaint.setColor(Color.RED); // mPaint.setStyle(Style.FILL); // canvas.drawCircle(50, 50, 50, mPaint); // Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); Drawable drawable = new BitmapDrawable(mBitmap);// 转换为drawable // canvas.drawBitmap(mBitmap, getWidth() / 2 - (100), getHeight() / 2, // mPaint); 这是绘制一个图片 this.setBackgroundDrawable(drawable); canvas.translate(getWidth() - (getWidth() / 4), getHeight() / 2 - getHeight() / 3);// 下面绘制的控件的位置 // 偏右20dp // canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), // mPaint); // mPaint.setColor(Color.RED); // mPaint.setStyle(Style.FILL); // mPaint.setAlpha(0); // mPaint.setStrokeJoin(Paint.Join.ROUND); // mPaint.setStrokeCap(Paint.Cap.ROUND); // mPaint.setAntiAlias(true); // mPaint.setStyle(Style.STROKE); // mPaint.setStrokeWidth(3); mPaint.setColor(Color.RED); canvas.drawCircle(0, 0, 20, mPaint);// 绘制红色的圆 // 绘制红色圆中展示的文字 mPaint.setTextSize(mTextSize); mPaint.setColor(mTextColor); mPaint.getTextBounds(mText, 0, mText.length(), mRect); canvas.drawText(mText, -mRect.width() / 2, 0, mPaint); } /* * 设置新消息的数量 */ public void setText(int textCount) { if (textCount != 0) { this.mText = String.valueOf(textCount); invalidate(); } } /** * 当消息 呗查看后 为空 */ public void setGone() { if (mPaint != null) { mPaint.setColor(Color.TRANSPARENT); invalidate(); } } /** * 设置背景图片 可能是从网络上加载的图片 */ public void setBitmap(Bitmap bitMap) { if (bitMap != null) { Drawable drawable = new BitmapDrawable(bitMap);// bitmap转换为drawable this.setBackgroundDrawable(drawable); invalidate(); } } }下面是我们自定义的属性
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyView"> <attr name="text" format="string" /> <attr name="textColor" format="color"></attr> <attr name="textSize" format="dimension"></attr> </declare-styleable> </resources>
相关文章推荐
- android自定义view之模拟qq消息拖拽删除效果
- android自定义tabbar,并带badgeview消息提示
- Android 自定义View修炼-仿QQ5.0 的侧滑菜单效果的实现
- wing带你玩转自定义view系列(2) 简单模仿qq未读消息去除效果
- Android 自定义 View 之高仿 QQ 健康
- android:自定义HorizontalScrollView实现qq侧滑菜单
- android自定义tabbar,并带badgeview消息提示
- 【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析
- wing带你玩转自定义view系列(2) 简单模仿qq未读消息去除效果
- Android自定义ImageView,方角,圆角头像(可根据自己的需求来设定头像的圆角或者方角的大小)
- Android自定义View之高仿QQ健康
- Android自定义类似于QQ的消息提示框
- Android 自定义ImageView, 圆形六边形头像
- 恭喜发财! -- 手把手教你仿造一个qq下拉抢红包 Android自定义view
- 实现自定义view(2):仿Android QQ多屏幕显示ListView的效果
- Android 仿QQ侧边栏,自定义view的学习 <Garry进阶(三)>
- android自定义圆形头像view,继承imageview
- android自定义View实现图片上传进度显示(仿手机QQ上传效果)
- android:自定义HorizontalScrollView实现qq侧滑菜单 标签: HorizontalScrollView自定义viewqq侧滑菜单 2016
- 恭喜发财! -- 手把手教你仿造一个qq下拉抢红包 Android自定义view