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

Android开发-自定义View-AndroidStudio(二十三)onTouchEvent触摸事件

2017-01-05 11:56 681 查看
转载请注明出处:http://blog.csdn.net/iwanghang/
觉得博文有用,请点赞,请评论,请关注,谢谢!~

老规矩,先上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



觉得博文有用,请点赞,请评论,请关注,谢谢!~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐