andorid自定义组件,涂鸦的实现

来源:互联网 发布:32单片机蜂鸣器程序 编辑:程序博客网 时间:2024/05/22 14:25
      最近看了很多关于自定义控件的博客,其中有个关于涂鸦的博文中的例子在我的手机上就无法合适的使用,例如,我手指移动在屏幕右侧,结果线却画在了中间的位置,还以为是我手机的问题,结果发现只是代码中对各种大小和布局都是写死的。
  非常难说像android自带控件一般,随便设大小,边距这些,功能也不会变样,所以在此要做一个比较正常的涂鸦控件,主要是能够像普通android控件一般,能够在xml中设置样式直接控制该控件外观。
      首先该View从onMeasure()方法中获得自己的大小,接着再根据这个大小初始化Bitmap cacheBitmap,这个bitmap用来保存画的笔画的,同时也是该view的draw方法中需要画出来,展现给用户看的效果的bitmap
      然后,就是用OnTouch()方法来获得用户滑动的位置和状态来不断在cacheBitmap的画出路径

      最后,调用invalidate(),通知View调用自己的draw()方法


直接上代码吧,里面也有比较详细的注释了

<span style="font-size:18px;">public class TuyaView extends View {private Canvas canvas = null;private Paint paint = null;private Bitmap cacheBitmap = null;private Path path = null;// 记录路径path的起始位置float x, y;public TuyaView(Context context) {super(context);// TODO Auto-generated constructor stub}public TuyaView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}public TuyaView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);// TODO Auto-generated constructor stub}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stub// widthMeasureSpec、heightMeasureSpec是有高16位模式和低16位size,所以看起来会很大// 获得模式int mode = MeasureSpec.getMode(widthMeasureSpec);// AT_MOST限制最大尺寸,EXACTLY则是确定好尺寸了,例如在xml文件中设置了大小if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.EXACTLY) {// 获得View实际大小int width = MeasureSpec.getSize(widthMeasureSpec);int height = MeasureSpec.getSize(heightMeasureSpec);init(width , height);// 以下方法是设置View大小的方法,除非想在代码中控制大小,不然不应该在这里填写大小// 如果希望其生效则不要调用super.onMeasure(widthMeasureSpec, heightMeasureSpec);这句了// setMeasuredDimension(400, height);} else if (mode == MeasureSpec.UNSPECIFIED) { // View的大小不确定时Log.d("WOGU", "mode=UNSPECIFIED");}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}private void init(int width , int height) {cacheBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);paint = new Paint(Paint.DITHER_FLAG);path = new Path();paint.setColor(Color.RED);paint.setStyle(Paint.Style.FILL_AND_STROKE);//设置画笔笔画宽度paint.setStrokeWidth(1);paint.setAntiAlias(true);paint.setDither(true);canvas = new Canvas();canvas.setBitmap(cacheBitmap);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubfloat curX = event.getX();float curY = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:x = curX;y = curY;path.moveTo(x, y);break;case MotionEvent.ACTION_UP:path.quadTo(x, y, curX, curY);canvas.drawPath(path, paint);path.reset();break;case MotionEvent.ACTION_MOVE:path.quadTo(x, y, curX, curY);canvas.drawPath(path, paint);x = curX;y = curY;path.moveTo(x, y);break;}invalidate();return true;}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubcanvas.drawBitmap(cacheBitmap, 0, 0 ,paint);super.onDraw(canvas);}}</span>
直接在xml文件中控制大小和背景等,不影响该自定义view的使用
<com.example.tuyaview.TuyaView         android:layout_width="fill_parent"        android:layout_height="300dp"        android:background="@color/default_bg"        android:layout_gravity="center_horizontal|center"        />

完整应用在 这里,不过基本没什么其他内容了


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 做系统不读光驱怎么办 光盘放进电脑没反应怎么办 不服省高院裁定维持原判怎么办 咖啡和酒一起喝怎么办 跟法官联系不上怎么办 四维没有预约到怎么办 钥匙锁在车里怎么办 如果孩子很叛逆骂人打人怎么办 错过了今年规培怎么办 枣木怎么办才能搞直了 高中生和家里闹意见离家出走怎么办 校长信箱实名举报了怎么办 枣子吃多了胀气怎么办 红枣吃多了会怎么办 宁波南苑e家会员卡怎么办 宁波社保卡丢了怎么办 奶茶汉堡店经营不好改怎么办 军人保障卡丢了怎么办 军人保障卡丢失了怎么办 军人保障卡掉了怎么办 椎基底动脉供血不足怎么办 颈椎压迫神经脑供血不足怎么办 脑部基底动脉轻度狭窄怎么办 胸壁疼痛我该怎么办 厂房面积小于泄压面积怎么办 江苏海门农村自建房房产证怎么办 颈总动脉斑块形成怎么办 颈椎引起腔梗头晕怎么办 魅族手机变成英文怎么办 员工失去了工作乐趣怎么办 古墓丽影9出bug怎么办 气炉子打不着火怎么办 下面人员不参加公司拓展怎么办 重点班的差生怎么办 江苏考生选修考d怎么办 眼睛里有虫子该怎么办 屋里毛絮特别多怎么办 信用卡人员核核查单位地址怎么办 红米note电源键失灵怎么办 红米note4x跳屏怎么办 红米开机键坏了怎么办