Android 自定义View实现
2016-03-01 17:19
465 查看
首先定义构造方法 以及其父类
public class TranslateXView extends View { public TranslateXView(Context context, AttributeSet attrs) { super(context, attrs); init();} }
然后自定义view需要的属性(宽高,背景等不需要自定义)
如:<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TranslateXView"> <attr name="textColor" format="color" /> <attr name="textSize" format="dimension" /> </declare-styleable> </resources>
获取属性
public TranslateXView(Context context,AttributeSet attrs) { super(context,attrs); mPaint = new Paint(); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView); int textColor = a.getColor(R.styleable.TranslateXView_textColor, 0XFFFFFFFF); float textSize = a.getDimension(R.styleable.TranslateXView_textSize, 36); mPaint.setTextSize(textSize); mPaint.setColor(textColor); a.recycle(); }
重写touch事件
@Override public boolean onTouchEvent(MotionEvent ev){ { float currentX = ev.getX(); float currentY = ev.getY(); switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: startX = currentX; startY = currentY; this.currentX = startX; isTranslate = false; isSolid =false; break; case MotionEvent.ACTION_MOVE: isTranslate = Math.abs(currentX-startX) > moveSlop; this.currentX = currentX; if(isTranslate){ if(currentX > getWidth()) this.currentX = getWidth(); if(currentX < 0) this.currentX = 0; } break; case MotionEvent.ACTION_CANCEL: isTranslate =false; break; case MotionEvent.ACTION_UP: this.currentX =currentX; isTranslate = true; isSolid = true; if(currentX > getWidth()) this.currentX = getWidth(); if(currentX < 0) this.currentX = getWidth()/4; double multiple = this.currentX/getWidth(); if(multiple<=twenty) price = twenty; if(multiple>twenty&&multiple<=fourty){ price = multiple-twenty>1/8?fourty:twenty; } if(multiple>fourty&&multiple<=sixty){ price = multiple-fourty>1/8?sixty:fourty; } if(multiple>sixty&&multiple<=eighty){ price = multiple-sixty>1/8?eighty:sixty; } break; } if(isTranslate) invalidate(); return true; }
invalidate()通知view进行重绘。
重写view的draw方法
@Override protected void onDraw(Canvas canvas){ super.onDraw(canvas); int redLineWidth; if(isSolid){ changeText(); redLineWidth = (int)(getWidth()*price); }else if(isTranslate){ redLineWidth =(int)currentX; }else redLineWidth = getWidth()/4; drawProgressBar(canvas,redLineWidth); drawText(canvas,redLineWidth); }
然后使用canvas绘图就可以了,大致截图如下。
新来csdn,以后会持续写博客,希望大家一起进步。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories