当前位置: 首页 > news >正文

金华网站建设行业wordpress建站要用模板吗

金华网站建设行业,wordpress建站要用模板吗,建网站衡水哪家强?,wordpress 判断手机端前言最近在开发的路上越走越远了#xff0c;每天在看各位大神公众号更新内容是自定义View的时候#xff0c;一些小的内容有点模具#xff0c;决定回过头来温习一下过往的内容。此篇也是根据android群英传来总结的一篇文章。1 Android控件架构Android的每个控件都是占一块矩形…前言最近在开发的路上越走越远了每天在看各位大神公众号更新内容是自定义View的时候一些小的内容有点模具决定回过头来温习一下过往的内容。此篇也是根据android群英传来总结的一篇文章。1 Android控件架构Android的每个控件都是占一块矩形的区域大致的分两类继承View和ViewGroupViewGroup相当于一个容器他可以管理多个字View整个界面上的控件形成了一个树形结构也就是我们常说的控件树上层控件负责下层控件的测量和绘制并且传递交互事件通过findviewbyid()这个方法来获取其实就是遍历查找在树形图的顶部都有一个ViewParent对象这就是控制核心所有的交互管理事件都是由它统一调度和分配从而进行整个视图的控制2 View的测量我们想要绘制一个View首先还是得知道这个View的大小系统是如何把他绘制出来的在Android中我们要想绘制一个View就必须要知道这个View的大小然后告诉系统这个过程在onMeasure()中进行。Android给我们提供了一个设计短小精悍的类——MeasureSpec类通过他来帮助我们测量View, MeasureSpec是一个32位的int值其中高2位为测量模式低30为测量的大小在计算中使用位运算时为了提高并且优化效率三种测量模式如下EXACTLY 精确值模式表示父视图希望子视图的大小应该是由specSize的值来决定的系统默认会按照这个规则来设置子视图的大小开发人员当然也可以按照自己的意愿设置成任意的大小。AT_MOST最大值模式控件的尺寸不超过父控件允许的最大尺寸即可UNSPECIFIED表示开发人员可以将视图按照自己的意愿设置成任意的大小没有任何限制。这种情况比较少见不太会用到。一份模板代码private int measureWidth(int measureSpec) {int result 0;int specMode MeasureSpec.getMode(measureSpec);int specSize MeasureSpec.getSize(measureSpec);if (specMode MeasureSpec.EXACTLY) {result specSize;} else {result 200;if (specMode MeasureSpec.AT_MOST) {result Math.min(result, specSize);}}return result;}3 View的绘制Canvas顾名思义画布的意思而onDraw()就一个参数就是Canvas了我们要在其他地方绘制的话就需要new对象了Canvas canvas new Canvas(Bitmap);//绘制直线canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint);//绘制矩形canvas.drawRect(float left, float top, float right, float bottom, Paint paint);//绘制圆形canvas.drawCircle(float cx, float cy, float radius, Paint paint);//绘制字符canvas.drawText(String text, float x, float y, Paint paint);//绘制图形canvas.drawBitmap(Bitmap bitmap, float left, float top, Paint paint);4 ViewGroup的测量前面也说过ViewGroup是老大他是用来管理View的包括View的大小什么的当我们的ViewGroup大小是包裹内容的时候实际上ViewGroup会遍历所有的子View来获取View的大小从而决定自身的大小而在其他模式下会通过具体的值来自定自身的大小ViewGroup遍历所有的View会调用所有的View的onMeasure()方法来获取测量结果,当子View测量完毕之后就需要将子View放在合适的地方这部分是由onLayout()来进行的在我们自定义ViewGroup的时候一般都要重写onLayout()方法控制子View显示位置的逻辑同样如果需要wrap_content属性那就必须重写onLayout()方法了这点和View是相同的5 ViewGroup的绘制ViewGroup在一般情况下是不会绘制的因为他本身没有需要绘制的东西如果不是指定ViewGroup的背景颜色他连onDraw()都不会调用但是ViewGroup会使用dispatchDraw()来绘制其他子View其过程同样是遍历所哟普的子View,并调用子View的绘制方法来完成绘制的6 自定义View自定义View一直是个难点Android自带的控件很难满足我们的需求所欲我们需要重写控件或者自定义一个View但是一般强大的View都还是存在少许的bug的而且现在Android ROM的多样性适配问题也越来越麻烦了当然自定义View你熟悉之后可以了解系统绘制控件的原理而且能让你的APP更加美观强大。在View中通常有以下比较重要的回调方法首先,我们应该了解一下比较重要的回调方法:onDraw() 绘制View的显示内容onMeasure() 使用此方法时多是该View支持wrap_content属性onFinishInflate() 从XML加载组件后回调onSizeChanged() 组件大小改变后回调onMeasure(int widthMeasureSpec, int heightMeasureSpec)回调该方法进行测量onLayout(boolean changed, int left, int top, int right, int bottom)回调该方法确定显示位置onTouchEvent(MotionEvent event) 监听到触摸事件时的回调以上就是几种常用的回调的方法.上面的方法并不需要全部写出来看个人需要一般我们实现自定义控件有三种方法对现有的控件进行扩展通过组件来实现新的控件重写View来实现全新的控件6.1 对现有控件进行扩展这是一个我们十分常用的一个方法用来对现有的控件进行扩展比如TextView需要渐变啊什么的挺常用的这里我们就来写一个小栗子我們先來看下效果public class MyTextView extends TextView {private Paint mPaint1, mPaint2;public MyTextView(Context context) {super(context);initView();}public MyTextView(Context context, AttributeSet attrs) {super(context, attrs);initView();}public MyTextView(Context context, AttributeSet attrs,int defStyleAttr) {super(context, attrs, defStyleAttr);initView();}private void initView() {mPaint1 new Paint();mPaint1.setColor(getResources().getColor(android.R.color.holo_blue_light));mPaint1.setStyle(Paint.Style.FILL);mPaint2 new Paint();mPaint2.setColor(Color.YELLOW);mPaint2.setStyle(Paint.Style.FILL);}Overrideprotected void onDraw(Canvas canvas) {// 绘制外层矩形canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint1);// 绘制内层矩形canvas.drawRect(10,10,getMeasuredWidth() - 10,getMeasuredHeight() - 10,mPaint2);canvas.save();// 绘制文字前平移10像素canvas.translate(10, 0);// 父类完成的方法即绘制文本super.onDraw(canvas);canvas.restore();}}一个稍微复杂的TextView这个可以利用LinearGradientShaderMatrix来完成来实现一个闪闪发光的闪动效果我们充分的利用Shader渲染器来设置一个不断变化的LinearGradient首先我们要在onSizeChanged()方法中完成一些初始化操作public class CoolTextView extends TextView {private int mViewWidth;//初始化画笔private Paint mPaint;//渲染器private LinearGradient mLinearGradient;//矩阵private Matrix matrix;private int mTranslate;public CoolTextView(Context context) {super(context);}public CoolTextView(Context context, AttributeSet attrs) {super(context, attrs);}Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mPaintnew Paint();if (mViewWidth0){mViewWidthgetMeasuredWidth();if (mViewWidth0){//获取当前TextView的画笔mPaintgetPaint();//渲染器mLinearGradientnew LinearGradient(0,0,mViewWidth,0,new int[]{Color.BLUE, 0xffffffff, Color.BLUE},null, Shader.TileMode.CLAMP);mPaint.setShader(mLinearGradient);matrixnew Matrix();}}}Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (matrix!null){//修改可以改变显示的速度mTranslatemViewWidth/10;if (mTranslate1*mViewWidth){mTranslate-mViewWidth;}matrix.setTranslate(mTranslate,0);mLinearGradient.setLocalMatrix(matrix);//每隔100毫秒闪动一下postInvalidateDelayed(100);}}/*LinearGradient参数:float x0: 渐变起始点x坐标float y0:渐变起始点y坐标float x1:渐变结束点x坐标float y1:渐变结束点y坐标int[] colors:颜色 的int 数组float[] positions: 相对位置的颜色数组,可为null, 若为null,可为null,颜色沿渐变线均匀分布Shader.TileMode tile: 渲染器平铺模式*/}**6.2 复合控件 **创建一个复核人控件可以很好的创建出具有重要功能的控件集合这种方式经常需要继承一个合适的ViewGroup再给他添加指定功能的控件从而组成一个新的合适的控件通过这种方式创建的控件我们一般都会给他指定的一些属性让他具有更强的扩展性下面就以一个TopBar为例子讲解如何创建复合控件定义属性我们需要给他定义一些属性这样的话我们需要在values下新建一个attrs.xml文件我们在代码中是可以用 declare-styleable 标签去声明一些属性的然后name相当于ID让我们的类可以找到确定好之后我们新建一个类就叫TopBarViewpackage com.zc.demo;import android.content.Context;import android.content.res.TypedArray;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.view.ViewGroup;/*** TopBar* Created by Zc on 17/8/31.*/public class TopBarView extends ViewGroup {private int mLeftTextColor;private Drawable mLeftBackground;private String mLeftText;private int mRightTextColor;private Drawable mRightBackgroup;private String mRightText;private float mTitleSize;private int mTitleColor;private String mTitle;//带参构造方法public TopBarView(Context context, AttributeSet attrs) {super(context, attrs);//通过这个方法你可以从你的attrs.xml文件下读取读取到的值存储在你的TypedArrayTypedArray ta context.obtainStyledAttributes(attrs, R.styleable.TopBar);//读取出相应的值设置属性mLeftTextColor ta.getColor(R.styleable.TopBar_leftTextColor, 0);mLeftBackground ta.getDrawable(R.styleable.TopBar_leftBackground);mLeftText ta.getString(R.styleable.TopBar_leftText);mRightTextColor ta.getColor(R.styleable.TopBar_rightTextColor, 0);mRightBackgroup ta.getDrawable(R.styleable.TopBar_rightBackground);mRightText ta.getString(R.styleable.TopBar_rightText);mTitleSize ta.getDimension(R.styleable.TopBar_titleTextSize, 10);mTitleColor ta.getColor(R.styleable.TopBar_titleTextColor, 0);mTitle ta.getString(R.styleable.TopBar_title);//获取完TypedArray的值之后一般要调用recyle方法来避免重复创建时候的错误ta.recycle();}6.3 重写View来实现全新的控件当我们Android原生的控件不满足的话我们可以继承原来的控件修改也可以组合起来使用更加可以继承View创建一个新的控件View效果如图所示public class CircleProgressView extends View {private int mMeasureHeigth;private int mMeasureWidth;private Paint mCirclePaint;private float mCircleXY;private float mRadius;private Paint mArcPaint;private RectF mArcRectF;private float mSweepAngle;private float mSweepValue 66;private Paint mTextPaint;private String mShowText;private float mShowTextSize;public CircleProgressView(Context context, AttributeSet attrs,int defStyleAttr) {super(context, attrs, defStyleAttr);}public CircleProgressView(Context context, AttributeSet attrs) {super(context, attrs);}public CircleProgressView(Context context) {super(context);}Overrideprotected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {mMeasureWidth MeasureSpec.getSize(widthMeasureSpec);mMeasureHeigth MeasureSpec.getSize(heightMeasureSpec);setMeasuredDimension(mMeasureWidth, mMeasureHeigth);initView();}Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 绘制圆canvas.drawCircle(mCircleXY, mCircleXY, mRadius, mCirclePaint);// 绘制弧线canvas.drawArc(mArcRectF, 270, mSweepAngle, false, mArcPaint);// 绘制文字canvas.drawText(mShowText, 0, mShowText.length(),mCircleXY, mCircleXY (mShowTextSize / 4), mTextPaint);}private void initView() {float length 0;if (mMeasureHeigth mMeasureWidth) {length mMeasureWidth;} else {length mMeasureHeigth;}mCircleXY length / 2;mRadius (float) (length * 0.5 / 2);mCirclePaint new Paint();mCirclePaint.setAntiAlias(true);mCirclePaint.setColor(getResources().getColor(android.R.color.holo_blue_bright));mArcRectF new RectF((float) (length * 0.1),(float) (length * 0.1),(float) (length * 0.9),(float) (length * 0.9));mSweepAngle (mSweepValue / 100f) * 360f;mArcPaint new Paint();mArcPaint.setAntiAlias(true);mArcPaint.setColor(getResources().getColor(android.R.color.holo_blue_bright));mArcPaint.setStrokeWidth((float) (length * 0.1));mArcPaint.setStyle(Style.STROKE);mShowText setShowText();mShowTextSize setShowTextSize();mTextPaint new Paint();mTextPaint.setTextSize(mShowTextSize);mTextPaint.setTextAlign(Paint.Align.CENTER);}private float setShowTextSize() {this.invalidate();return 50;}private String setShowText() {this.invalidate();return Panda_Program;}public void forceInvalidate() {this.invalidate();}public void setSweepValue(float sweepValue) {if (sweepValue ! 0) {mSweepValue sweepValue;} else {mSweepValue 25;}this.invalidate();}}在来一个例子 效果如下所示模拟音频输入public class VolumeView extends View {private int mWidth;private int mRectWidth;private int mRectHeight;private Paint mPaint;private int mRectCount;private int offset 5;private double mRandom;private LinearGradient mLinearGradient;public VolumeView(Context context) {super(context);initView();}public VolumeView(Context context, AttributeSet attrs) {super(context, attrs);initView();}public VolumeView(Context context, AttributeSet attrs,int defStyleAttr) {super(context, attrs, defStyleAttr);initView();}private void initView() {mPaint new Paint();mPaint.setColor(Color.BLUE);mPaint.setStyle(Paint.Style.FILL);mRectCount 12; //条形数量}//条形的渐变色Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mWidth getWidth();mRectHeight getHeight();mRectWidth (int) (mWidth * 0.6 / mRectCount);mLinearGradient new LinearGradient(0,0,mRectWidth,mRectHeight,Color.YELLOW,Color.BLUE,Shader.TileMode.CLAMP);mPaint.setShader(mLinearGradient);}Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);for (int i 0; i mRectCount; i) {mRandom Math.random();float currentHeight (float) (mRectHeight * mRandom);canvas.drawRect((float) (mWidth * 0.4 / 2 mRectWidth * i offset),currentHeight,(float) (mWidth * 0.4 / 2 mRectWidth * (i 1)),mRectHeight,mPaint);}//300毫秒重新绘制一次postInvalidateDelayed(300);}}7 自定义ViewGroup这个管理子View的管理者我们来定义一下通常我们自定义ViewGroup是需要onMeasure()来测量的然后重写onLayout()来确定位置重写onTouchEvent()来相应事件接下来制作一个仿ScrollView的效果并且增加粘性事件。public class MyScrollView extends ViewGroup {private int mScreenHeight;private Scroller mScroller;private int mLastY;private int mStart;private int mEnd;public MyScrollView(Context context) {super(context);initView(context);}public MyScrollView(Context context, AttributeSet attrs) {super(context, attrs);initView(context);}public MyScrollView(Context context, AttributeSet attrs,int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context);}private void initView(Context context) {WindowManager wm (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics dm new DisplayMetrics();wm.getDefaultDisplay().getMetrics(dm);mScreenHeight dm.heightPixels;mScroller new Scroller(context);}Overrideprotected void onLayout(boolean changed,int l, int t, int r, int b) {int childCount getChildCount();// 设置ViewGroup的高度MarginLayoutParams mlp (MarginLayoutParams) getLayoutParams();mlp.height mScreenHeight * childCount;setLayoutParams(mlp);for (int i 0; i childCount; i) {View child getChildAt(i);if (child.getVisibility() ! View.GONE) {child.layout(l, i * mScreenHeight,r, (i 1) * mScreenHeight);}}}Overrideprotected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int count getChildCount();for (int i 0; i count; i) {View childView getChildAt(i);measureChild(childView,widthMeasureSpec, heightMeasureSpec);}}Overridepublic boolean onTouchEvent(MotionEvent event) {int y (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastY y;mStart getScrollY();break;case MotionEvent.ACTION_MOVE:if (!mScroller.isFinished()) {mScroller.abortAnimation();}int dy mLastY - y;if (getScrollY() 0) {dy 0;}if (getScrollY() getHeight() - mScreenHeight) {dy 0;}scrollBy(0, dy);mLastY y;break;case MotionEvent.ACTION_UP:int dScrollY checkAlignment();if (dScrollY 0) {if (dScrollY mScreenHeight / 3) {mScroller.startScroll(0, getScrollY(),0, -dScrollY);} else {mScroller.startScroll(0, getScrollY(),0, mScreenHeight - dScrollY);}} else {if (-dScrollY mScreenHeight / 3) {mScroller.startScroll(0, getScrollY(),0, -dScrollY);} else {mScroller.startScroll(0, getScrollY(),0, -mScreenHeight - dScrollY);}}break;}postInvalidate();return true;}private int checkAlignment() {int mEnd getScrollY();boolean isUp ((mEnd - mStart) 0) ? true : false;int lastPrev mEnd % mScreenHeight;int lastNext mScreenHeight - lastPrev;if (isUp) {//向上的return lastPrev;} else {return -lastNext;}}Overridepublic void computeScroll() {super.computeScroll();if (mScroller.computeScrollOffset()) {scrollTo(0, mScroller.getCurrY());postInvalidate();}}}8 事件拦截机制分析这章讲的是一个事件拦截机制的一些基本概念当Android系统扑捉到用户的各种输入事件之后如何准确的传递给真正需要这个事件的控件尼其实Android提供了一套非常完善的事件传递处理机制来帮助开发者完成准确的事件分配和处理要想了解拦截机制我们首先要知道什么事触摸事件一般MotionEvent提供的手势我们常用的几个DOWN,UP,MOVE什么的在MotionEvent中封装了很多东西比如获取坐标点event.getX()和getRawX()获取一般ViewGroup我们需要重写三个方法Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {return super.dispatchTouchEvent(ev);}Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {return super.onInterceptTouchEvent(ev);}Overridepublic boolean onTouchEvent(MotionEvent event) {return super.onTouchEvent(event);}而View则只要重写两个方法Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {return super.dispatchTouchEvent(ev);}Overridepublic boolean onTouchEvent(MotionEvent event) {return super.onTouchEvent(event);}小结至此空间架构与自定义控件基础内容就完成了日后碰见有趣的自定义控件我会更新在我的博客上欢迎浏览
http://wiki.neutronadmin.com/news/57242/

相关文章:

  • 趣php网站开发实战代码制作网站接单
  • 门户型网站网店营销推广策略
  • 临沧网站建设网站设计西安学习
  • 建设一个网站的基本步骤网站的毕业设计怎么做
  • 灯具网站建设门户网站建设需求模板
  • 免费网站你懂我意思正能量软件网站制作难度
  • 收录查询站长工具上海大型网站开发公司
  • 五合一免费建站中小企业管理软件
  • vc 做网站源码ajax网站开发技术
  • 收纳用品网站建设wordpress 替换图片不显示
  • 运城做网站公司建设银行的官方网站电话
  • 什么网站可以做软件有哪些东西吗深圳公共资源交易平台
  • 受欢迎的医疗网站建设建设一个好的网站
  • 网站制作费用多少办公室装修费用会计分录
  • 微网站建设网站对接国家战略建设海上福州网站
  • 淮安住房与城乡建设部网站网站建设皿金手指排名
  • 淘宝电子网站建设论文西宁做网站公司排名
  • 沂南建设局网站网站打开很慢怎么回事啊
  • 公司微网站建设价格兰州seo培训
  • 基于分布式控件的网站开发框架较好的网站建设公司
  • 网站不设置关键词描述熟悉网站空间 域名等相关知识
  • 400电话网络推广商城网站百度收录哪个网站多
  • 怎么做网站鹅蛋生蚝郑州网站seo
  • 获取网站访客qq信息wordpress2018
  • 个人备案网站能用公司一般在什么网站上做电子请帖
  • 网站建设的结论和体会下载班级优化大师并安装
  • 本地郑州网站建设网站关键词做的越多越好吗
  • 网络培训网站开发文献综述怎么样创建微信公众号
  • 简述网页建站流程怎么查看网站有没有做ssl
  • 中英文双语网站站点艺商网站