Android开发-自定义View-AndroidStudio(二十三)onTouchEvent触摸事件
2017-01-05 11:56
681 查看
转载请注明出处:http://blog.csdn.net/iwanghang/
觉得博文有用,请点赞,请评论,请关注,谢谢!~
老规矩,先上GIF动态图,看个效果,如果符合你的项目或者确定你要了解的内容,再往下看吧:
这篇博文是接着前面2篇博文写的,主要是演示一下点击事件拦截。
实现根据Number类中的数组,绘制数字。获取按下的数字。以及重新绘制另一组数字。
NewView.java:
转载请注明出处:http://blog.csdn.net/iwanghang/
欢迎移动开发爱好者交流
沈阳或周边城市公司有意开发Android,请与我联系
联系方式
微信:iwanghang
QQ:413711276
邮箱:iwanghang@qq.com
觉得博文有用,请点赞,请评论,请关注,谢谢!~
觉得博文有用,请点赞,请评论,请关注,谢谢!~
老规矩,先上GIF动态图,看个效果,如果符合你的项目或者确定你要了解的内容,再往下看吧:
这篇博文是接着前面2篇博文写的,主要是演示一下点击事件拦截。
实现根据Number类中的数组,绘制数字。获取按下的数字。以及重新绘制另一组数字。
NewView.java:
package com.iwanghang.newview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.Toast; public class NewView extends View{ // 单元格的宽度和高度 private float width; private float height; private int checkPoint = 1; // 当前关卡 //private Number number = new Number(); private Number number = new Number(checkPoint); public NewView(Context context, AttributeSet attrs) { super(context, attrs); } public NewView(MainActivity mainActivity) { super(mainActivity); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { this.width = w / 9f; this.height = h / 10f; super.onSizeChanged(w, h, oldw, oldh); } // 当Android系统需要绘制一个View对象时,就会调用该对象的onDraw @Override protected void onDraw(Canvas canvas) { // 画背景 Paint backgroundPaint = new Paint(); backgroundPaint.setColor(getResources().getColor(R.color.colorBackground)); canvas.drawRect(0,0,getWidth(),getHeight(),backgroundPaint); Paint darkPaint = new Paint(); darkPaint.setColor(getResources().getColor(R.color.colorDark)); Paint hilitePaint = new Paint(); hilitePaint.setColor(getResources().getColor(R.color.colorHilite)); Paint lightPaint = new Paint(); lightPaint.setColor(getResources().getColor(R.color.colorLight)); // 绘制9X9的网络格 // 两条距离为1的直线,视觉上会有割裂的效果 for (int i = 0; i < 9; i++) { canvas.drawLine(0, i*height, getWidth(), i*height, lightPaint); canvas.drawLine(0, i*height+1, getWidth(), i*height+1, hilitePaint); canvas.drawLine(i*width, 0, i*width, getHeight(), lightPaint); canvas.drawLine(i*width+1, 0, i*width+1, getHeight(), hilitePaint); } // 绘制3X3的网络格 for (int i = 0; i < 10; i++) { if (i % 3 != 0) { continue; } canvas.drawLine(0, i*height, getWidth(), i*height, darkPaint); canvas.drawLine(0, i*height+1, getWidth(), i*height+1, hilitePaint); canvas.drawLine(i*width, 0, i*width, getHeight(), darkPaint); //canvas.drawLine(i*width+1, 0, i*width+1, getHeight(), hilitePaint); canvas.drawLine(i*width, 1, i*width, getHeight(), hilitePaint); } // 绘制数字 Paint numberPaint = new Paint(); numberPaint.setColor(Color.BLACK); numberPaint.setStyle(Paint.Style.STROKE); numberPaint.setTextSize(height*0.75f); numberPaint.setTextAlign(Paint.Align.CENTER); numberPaint.setAntiAlias(true); // 抗锯齿 /** * 数字居中位置 * x轴居中比较容易计算 * y轴居中的计算,依赖于FontMetrics,大家很容易百度到相关的知识 */ Paint.FontMetrics fm = numberPaint.getFontMetrics(); float x = width / 2; float y = height / 2 - (fm.ascent + fm.descent) / 2; // canvas.drawText("1", 0 * width + x, 0 * height + y, numberPaint); // canvas.drawText("2", 1 * width + x, 1 * height + y, numberPaint); // canvas.drawText("3", 2 * width + x, 2 * height + y, numberPaint); // canvas.drawText("4", 3 * width + x, 3 * height + y, numberPaint); // canvas.drawText("5", 4 * width + x, 4 * height + y, numberPaint); /** * 根据Number类中的数组,绘制数字 */ for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { canvas.drawText(number.getTileString(i,j), i*width+x, j*height+y, numberPaint); } } /** * 绘制一个刷新文字 */ canvas.drawText("刷新",4*width+x,9*height+y,numberPaint); super.onDraw(canvas); } /** * 获取按下的数字 */ @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); if (event.getAction() == MotionEvent.ACTION_DOWN){ int selectedX = (int)(event.getX() / width); int selectedY = (int)(event.getY() / height); String used = number.getTileString(selectedX,selectedY); //Toast.makeText(getContext(), "ACTION_DOWN = " + used, Toast.LENGTH_SHORT).show(); if (selectedY == 9){ if (selectedX>=3 && selectedX<=5){ Toast.makeText(getContext(), "ACTION_DOWN = 刷新", Toast.LENGTH_SHORT).show(); Toast.makeText(getContext(), "checkPoint = " + checkPoint, Toast.LENGTH_SHORT).show(); if (checkPoint == 1){ checkPoint = 2; }else { checkPoint = 1; } number = new Number(checkPoint); invalidate(); // onDraw() } }else { Toast.makeText(getContext(), "ACTION_DOWN = " + used, Toast.LENGTH_SHORT).show(); } } return true; } }Number.java:
package com.iwanghang.newview; public class Number { // 定义81个数字+9个数字 private final String str1 = "1230004560" + "1230004560" + "1230004560" + "1230004560" + "1230004560" + "1230004560" + "1230004560" + "1230004560" + "7" + "000000000"; private final String str2 = "9080701230" + "9080701230" + "9080701230" + "9080701230" + "9080701230" + "9080701230" + "9080701230" + "9080701230" + "9" + "000000000"; // 实例化一个下标81的数组 //private int number[] = new int[9*9]; // 因为加了一行显示刷新文字的,所以变成9列10行 private int number[] = new int[9*10]; public Number(){ number = fromPuzzleString(str1); } public Number(int str){ if (str == 1){ number = fromPuzzleString(str1); }else if (str == 2){ number = fromPuzzleString(str2); } } // 把81个数字设置到数组中,为0的设置为空 private int[] fromPuzzleString(String str) { int[] number = new int[str.length()]; for (int i = 0; i < number.length; i++) { number[i] = str.charAt(i) - '0'; } return number; } // 根据数字在第几行第几个,获取其在数组中的下表 private int getTile(int x, int y){ return number[y * 9 + x]; } // 获取数字的字符串类型 public String getTileString(int x, int y){ int v = getTile(x,y); if (v == 0){ return ""; }else return String.valueOf(v); } }MainActivity.java:
package com.iwanghang.newview; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().hide(); //setContentView(R.layout.activity_main); NewView newView = new NewView(this); setContentView(newView); } }
转载请注明出处:http://blog.csdn.net/iwanghang/
欢迎移动开发爱好者交流
沈阳或周边城市公司有意开发Android,请与我联系
联系方式
微信:iwanghang
QQ:413711276
邮箱:iwanghang@qq.com
觉得博文有用,请点赞,请评论,请关注,谢谢!~
相关文章推荐
- Android开发-自定义View-AndroidStudio(二十三)onTouchEvent触摸事件
- android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题
- android 自定义view,绘制与onTouchEvent事件(一)
- Android开发08_OnTouchevent触摸事件(手势监听)
- 【Android View】Android中View对触摸事件的处理和传递dispatchTouchEvent、onInterceptTouchEvent
- android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题
- 从源码角度带你分析 Android View 事件分发 dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程(一)
- 自定义控件(视图)2期笔记14:自定义视图之View事件分发 dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程
- android ViewGroup的onInterceptTouchEvent 和 onTouchEvent事件
- View触摸事件分发流程dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
- Android触摸屏事件派发机制详解与源码分析一(View篇)onTouch,onClick,ontouchevent
- Android 触摸事件的分发与处理流程:onInterceptTouchEvent和onTouchEvent
- Android 屏幕触摸事件之诡----dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent,onTouch
- Android事件传递机制以及ViewGroup的onInterceptTouchEvent的理解
- android-自定义ViewGroup与onTouchEvent监听-随心
- android触摸事件传递机制以及onInterceptTouchEvent()和onTouchEvent()总结
- ViewGroup触摸事件的分发,拦截,消耗(dispatchTouchEvent , onInterceptTouchEvent , onTouchEvent)
- (转)Android ViewGroup的onInterceptTouchEvent()事件分析
- Android_onDraw画圆与onTouchEvent方法处理触摸事件
- Android 自定义View 环绕六边形控件及其TouchEvent事件的监听