【Android】自定义view的模版
2016-02-24 07:01
375 查看
【关键词】
【问题】
写一个自定义View的模板
【注意事项】
自定义View的时候,会遇到padding无效的问题,需要做特殊处理;
如果有滑动的操作,需要解决滑动冲突;
【代码】
自定义View
模版
【问题】
写一个自定义View的模板
【注意事项】
自定义View的时候,会遇到padding无效的问题,需要做特殊处理;
如果有滑动的操作,需要解决滑动冲突;
【代码】
publicclassCustomViewextendsView{
privatePaintmPaint;
privateFontMetricsIntmFontMetricsInt;
privateRectmRect;
privateintmWidth;
privateintmHeight;
privateintmPaddingStart;
privateintmPaddingEnd;
privateintmPaddingTop;
privateintmPaddingBottom;
privateintmLeft;
privateintmTop;
privateintmRight;
privateintmBottom;
privateContextmContext;
publicCustomView(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
mContext=context;
initTool();
}
publicCustomView(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicCustomView(Contextcontext){
this(context,null);
}
privatevoidinitTool(){
mPaint=newPaint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setTextSize(sp2Px(mContext,11));
mPaint.setTextAlign(Paint.Align.CENTER);
mRect=newRect();
mFontMetricsInt=mPaint.getFontMetricsInt();
}
@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
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
publicbooleandispatchTouchEvent(MotionEventevent){
ViewParentparent=getParent();
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
parent.requestDisallowInterceptTouchEvent(true);
break;
caseMotionEvent.ACTION_UP:
parent.requestDisallowInterceptTouchEvent(false);
break;
default:
break;
}
returnsuper.dispatchTouchEvent(event);
}
@Override
protectedvoidonDraw(Canvascanvas){
//画背景,如果存在的画
Drawablebg=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);
}
//工具类
publicstaticintgetSizeFromMeasureSpec(intmeasureSpec,intdefaultSize){
intresult=0;
intmode=MeasureSpec.getMode(measureSpec);
intsize=MeasureSpec.getSize(measureSpec);
if(mode==MeasureSpec.EXACTLY){
result=size;
}else{
result=defaultSize;
if(mode==MeasureSpec.AT_MOST){
result=Math.min(defaultSize,size);
}
}
returnresult;
}
publicstaticfloatsp2Px(Contextcontext,floatsp){
DisplayMetricsmetrics=newDisplayMetrics();
WindowManagerwm=(WindowManager)context
.getSystemService(Context.WINDOW_SERVICE);
Displaydisplay=wm.getDefaultDisplay();
display.getMetrics(metrics);
floatpx=metrics.scaledDensity;
returnsp*px;
}
}
相关文章推荐
- 【Android】监听蓝牙状态变化
- 【Android】使用ProgressBar遇到的问题
- android xml点击交互
- 【Android】沉浸式状态栏的两种实现方式
- Android屏幕适配
- android 成长日记 6.ListView详解
- android圆形图片,圆形背景文字的CircleTextImageView开源组件
- 【Android】图片资源的加载、简单处理
- 【Android】多媒体编程——MediaPlayer音频播放
- 【Android】Intent过滤器
- 【Android】BroadcastReceiver的生命周期
- 【Android】Activity启动模式
- Android下拉刷新汽车加速仪表盘效果
- Android Studio 常见问题之Rendering Problems
- Drawable Resources
- Android笔记之Activity
- Android Service生命周期 Service里面的onStartCommand()方法详解
- GitHub 优秀的 Android 开源项目
- Android 设备兼容
- Android实现版本更新提示