【Android】自定义view的模版
来源:互联网 发布:凸包 最快算法 编辑:程序博客网 时间:2024/04/28 14:56
【关键词】
自定义View
模版
【问题】
- 写一个自定义View的模板
【注意事项】
- 自定义View的时候,会遇到 padding 无效的问题,需要做特殊处理;
- 如果有滑动的操作,需要解决滑动冲突;
【代码】
public class CustomView extends View {
private Paint mPaint;
private FontMetricsInt mFontMetricsInt;
private Rect mRect;
private int mWidth;
private int mHeight;
private int mPaddingStart;
private int mPaddingEnd;
private int mPaddingTop;
private int mPaddingBottom;
private int mLeft;
private int mTop;
private int mRight;
private int mBottom;
private Context mContext;
public CustomView (Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
initTool();
}
public CustomView (Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomView (Context context) {
this(context, null);
}
private void initTool() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setTextSize(sp2Px(mContext, 11));
mPaint.setTextAlign(Paint.Align.CENTER);
mRect = new Rect();
mFontMetricsInt = mPaint.getFontMetricsInt();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mWidth = getSizeFromMeasureSpec(widthMeasureSpec, 280);
mHeight = getSizeFromMeasureSpec(heightMeasureSpec, 280);
mPaddingStart = getPaddingStart();
mPaddingEnd = getPaddingEnd();
mPaddingTop = getPaddingTop();
mPaddingBottom = getPaddingBottom();
mLeft = mPaddingStart;
mTop = mPaddingTop;
mRight = mWidth - mPaddingEnd;
mBottom = mHeight - mPaddingBottom;
setMeasuredDimension(mWidth, mHeight);
}
// 事件拦截,防止滑动冲突,与ScrollView等可滑动控件之间;
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
ViewParent parent = getParent();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
parent.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
parent.requestDisallowInterceptTouchEvent(false);
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
// 画背景,如果存在的画
Drawable bg = getBackground();
if(bg!=null){
bg.draw(canvas);
}
// 画背景
canvas.drawColor(Color.RED);
// 画 Padding 以内区域的背景
mRect.set(mLeft, mTop, mRight, mBottom);
mPaint.setColor(Color.YELLOW);
canvas.drawRect(mRect, mPaint);
// TODO 其他画图的操作(注意:不推荐在 onDraw 方法中 new 对象,可以使用全局变量)
super.onDraw(canvas);
}
// 工具类
public static int getSizeFromMeasureSpec(int measureSpec, int defaultSize) {
int result = 0;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if(mode == MeasureSpec.EXACTLY){
result = size;
} else {
result = defaultSize;
if(mode == MeasureSpec.AT_MOST){
result = Math.min(defaultSize, size);
}
}
return result;
}
public static float sp2Px(Context context, float sp){
DisplayMetrics metrics = new DisplayMetrics();
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
display.getMetrics(metrics);
float px = metrics.scaledDensity;
return sp * px;
}
}
0 0
- 【Android】自定义view的模版
- iOS: xib自定义view的模版小记
- android的自定义View
- Android自定义View研究:View的大小
- Android自定义View研究:View的大小
- Android自定义View研究:View的大小
- android自定义View---生成虚线的View
- android自定义View---生成虚线的View
- Android自定义View(一) View的测量
- Android自定义View 之 View的测量
- Android 自定义View之View的绘制
- Android 自定义View基础-View的测量
- Android 自定义View基础-View的绘制
- android 自定义view的样式
- android自定义View的用法
- android 自定义View的属性
- Android 自定义VIEW的运用
- Android自定义简单的View
- 软件稳定性测试
- Python图像处理库PIL的ImageChops模块介绍
- 【Android】监听蓝牙状态变化
- Python的defaultdict模块和namedtuple模块
- c语言2进制文件操作
- 【Android】自定义view的模版
- 第14章重载运算与类型转换
- fmemopen、open_memstream/wmemstream
- 升级CentOS的版本
- R语言中的方差分析
- 【bzoj1053】[HAOI2007]反素数ant DFS
- 20160221模拟
- iOS-KVO使用避免的陷阱
- COBBLER无人值守安装