break;
case MotionEvent.ACTION_UP:
isPressFlag = false;
if (mSelectData != null && mSelectData.size() != 0) {
//抬起的时候,密码回调
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < mSelectData.size(); i++) {
stringBuilder.append(mSelectData.get(i).i);
}
// System.out.println(“stringBuilder.toString() ->” + stringBuilder.toString());
mOnTouchResult.result(stringBuilder.toString());
}
//清除状态
postDelayed(new Runnable() {
@Override
public void run() {
clearState();
invalidate();
}
},1000);
break;
}
return true;
}
private void clearState() {
isWrongFlag = false;
mSelectData.clear();
for (int i = 0; i < mPointData.size(); i++) {
mPointData.get(i).state = myPoint.STATE_NORMAL;
}
}
//检查是否在圈内
private boolean checkIsInCircle(float downPointX, float downPointY, float centerX, float centerY, float R) {
return Math.sqrt(Math.pow(downPointX - centerX, 2) + Math.pow(downPointY - centerY, 2)) < R;
}
//初始化画笔
private Paint initPaint(int color) {
Paint paint = new Paint();
paint.setDither(true);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(color);
paint.setStrokeWidth(5);
return paint;
}
//画圈
private void drawCircle(Canvas canvas) {
System.out.println(“drawCircle mSelectData ->” + mSelectData);
System.out.println(“drawCircle mPointData ->” + mPointData);
for (int i = 0; i < mPointData.size(); i++) {
if (mPointData.get(i).state == myPoint.STATE_NORMAL) {
canvas.drawCircle(mPointData.get(i).x, mPointData.get(i).y, outCircleR, normalPaint);
canvas.drawCircle(mPointData.get(i).x, mPointData.get(i).y, inCircleR, normalPaint);
} else if (mPointData.get(i).state == myPoint.STATE_DOWN) {
canvas.drawCircle(mPointData.get(i).x, mPointData.get(i).y, outCircleR, downPaint);
canvas.drawCircle(mPointData.get(i).x, mPointData.get(i).y, inCircleR, downPaint);
}else if (mPointData.get(i).state == myPoint.STATE_ERROR) {
canvas.drawCircle(mPointData.get(i).x, mPointData.get(i).y, outCircleR, errorPaint);
canvas.drawCircle(mPointData.get(i).x, mPointData.get(i).y, inCircleR, errorPaint);
}
}
}
//初始化九个单元格
private void initCell() {
mPointData = new ArrayList<>();
//获取布局宽高
int width = getWidth();
int height = getHeight();
//第一个点的位置
float possionX = 0;
float possionY = 0;
//横竖屏兼容,计算第一个点的坐标
if (width < height) {
possionX = width * 1.0f / 6;
possionY = (height - width) * 1.0f / 2 + width * 1.0f / 6;
height = width;
} else {
possionX = (width - height) * 1.0f / 2 + height * 1.0f / 6;
possionY = height * 1.0f / 6;
width = height;
}
//设置内外圆的半径
outCircleR = width * 1.0f / 12;
inCircleR = width * 1.0f / 50;
//循环产生九个点
int n = 1;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
mPointData.add(new myPoint(possionX + j * width * 1.0f / 3, possionY + i * height * 1.0f / 3, n++));
}
}
}
public void setOnTouchResultListener(onTouchResult onTouchResult) {
this.mOnTouchResult = onTouchResult;
}
public interface onTouchResult {
void result(String s);
}
public void pwdError() {
isWrongFlag = true;
for (int i = 0; i < mSelectData.size(); i++) {
mSelectData.get(i).state = myPoint.STATE_ERROR;
}
System.out.println(“mSelectData ->” + mSelectData);
invalidate();
}
}
//创建一个点类 里面主要存储 点的位置和序号 这里为了减少代码量 我就不用 get 和 set 方法了
class myPoint {
public float x;
public float y;
public int i;
public static final int STATE_NORMAL = 0;
public static final int STATE_DOWN = 1;
public static final int STATE_ERROR = 2;
public int state = STATE_NORMAL;
public myPoint(float x, float y, int i) {
this.x = x;
this.y = y;
this.i = i;
}
@Override
public String toString() {
return “myPoint{” +
“x=” + x +
“, y=” + y +
“, i=” + i +
“, state=” + state +
‘}’;
}
}
<?xml version="1.0" encoding="utf-8"?>二、编写xml文件
<LinearLayout
xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:app=“http://schemas.android.com/apk/res-auto”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
tools:context=“.MainActivity”>
<com.wust.nineview.selfNineView
android:id=“@+id/snv_selfnineview”
android:layout_width=“match_parent”
android:layout_height=“match_parent”/>
三、调用
package com.wust.nineview;
import androidx.appcompat.app.AppCompatActivity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private selfNineView snv_selfnineview;
private final static String CORRECT_PWD = “13579”;
private Toast mToast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
snv_selfnineview = findViewById(R.id.snv_selfnineview);
snv_selfnineview.setOnTouchResultListener(new selfNineView.onTouchResult() {
@Override
public void result(String s) {
if (CORRECT_PWD.equals(s)){
showToast(“密码输入正确”);
}else {
showToast(“密码输入错误,请重试”);
snv_selfnineview.pwdError();
}
}
});
}
private void showToast(String text) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (mToast == null){
mToast = Toast.makeText(MainActivity.this,null,Toast.LENGTH_SHORT);
}
mToast.setText(text);
mToast.show();
}
});
}
}
代码分析
====
在这个自定义View里我觉得我印象最深的是这么两点。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
结尾
最后,针对上面谈的内容,给大家推荐一个Android资料,应该对大家有用。
首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)
泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶
注解原理丶注解原理丶序列化
Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)
代码框架结构优化(数据结构丶排序算法丶设计模式)
APP性能优化(用户体验优化丶适配丶代码调优)
热修复丶热升级丶Hook技术丶IOC架构设计
NDK(c编程丶C++丶JNI丶LINUX)
如何提高开发效率?
MVC丶MVP丶MVVM
微信小程序
Hybrid
Flutter
接下来是资料清单:(敲黑板!!!)
1.数据结构和算法
2.设计模式
3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记
4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)
不论遇到什么困难,都不应该成为我们放弃的理由!共勉~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
小程序
Hybrid
Flutter
[外链图片转存中…(img-NEI3q2bt-1711635373191)]
接下来是资料清单:(敲黑板!!!)
1.数据结构和算法
[外链图片转存中…(img-MkndbuUE-1711635373191)]
2.设计模式
[外链图片转存中…(img-4rsu6C6N-1711635373192)]
3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记
[外链图片转存中…(img-zwJyKLp0-1711635373192)]
4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)
[外链图片转存中…(img-bhg4tKCL-1711635373192)]
不论遇到什么困难,都不应该成为我们放弃的理由!共勉~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
[外链图片转存中…(img-Pwe69mVK-1711635373193)]