您的位置:首页 > 移动开发 > Android开发

【Android】自定义view的模版

2016-02-24 07:01 375 查看
【关键词】

自定义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;
}
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: