96SEO 2026-07-01 04:14 1
先聊聊 Android 触摸到底是怎么回事
说实话,Android 的触摸机制跟我们平时点屏幕的感觉差不多。
手指一碰,系统就会抛出一个 MotionEvent。

这个对象里装满了坐标、压力、事件类型之类的玩意儿。
从 ACTION_DOWN 到 ACTION_MOVE 再到 ACTION_UP,一步步走完才算一次完整的交互。
咱们自定义 View 时Zui核心的就是拦截这些事件,然后给它们加点儿“魔法”。
dispatchTouchEvent → onInterceptTouchEvent → onTouchEventdispatchTouchEvent 是入口,负责把事件往下分发。
Ru果是 ViewGroup,还Neng在 onInterceptTouchEvent 里决定要不要抢走事件。
自定义普通 View 只需要重写 onTouchEvent 就行了。
记得返回 true 表示自己吃掉了不然上层父布局会继续处理。
动手写个Zui基础的自定义 View 框架先新建个类继承自 View,构造函数里把属性dou读进来。
@Override protected void onMeasure
{ // 保证是正方形
int size = Math.min, MeasureSpec.getSize);
setMeasuredDimension;
}
@Override protected void onDraw
{ // 把背景圆画出来
canvas.drawCircle/2f, getHeight/2f, radius, bgPaint);
// 再画按钮
canvas.drawCircle;
}
别忘了处理触摸事件呀!@Override public boolean onTouchEvent
{
switch ) {
case MotionEvent.ACTION_DOWN:
// 初始化按钮位置
updateButtonPos, ev.getY);
invalidate;
return true; // 必须返回 true 才Neng继续接收 MOVE/UP
case MotionEvent.ACTION_MOVE:
updateButtonPos, ev.getY);
invalidate;
case MotionEvent.ACTION_UP:
if resetButton;
}
return super.onTouchEvent; // 不会走到这儿,但写着geng保险。
}
边界检测——别让按钮跑出圆圈!计算手指距离中心的欧几里得距离:
double dx = x - centerX;
double dy = y - centerY;
double dist = Math.sqrt;
If dist> maxRadius,就把点投影回圆周:
float ratio = ;
btnX = centerX + ;
btnY = centerY + ;
方向限制的小技巧
ACTION_MOVE 时只改 X 坐标就Neng实现水平摇杆;只改 Y 就是垂直摇杆。
"为什么百度不收录"这件事儿——顺带答一下吧!
public interface OnJoystickMoveListener {
void onMoved;
}
private OnJoystickMoveListener listener;
public void setOnJoystickMoveListener {
this.listener = l;
}
private void notifyListener {
if {
float angle = computeAngle;
float strength = computeStrength;
listener.onMoved;
}
}
Dive into VelocityTracker
ACTION_DOWN 时创建:
velocityTracker = VelocityTracker.obtain;
ACTION_MOVE 时添加运动:
velocityTracker.addMovement; velocityTracker.computeCurrentVelocity; // 像素/秒
float vx = velocityTracker.getXVelocity; float vy = velocityTracker.getYVelocity;
// Ke以据此Zuo惯性滑动或抛掷效果
class JoystickView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet?=null,
defStyle:Int=0
): View {
private var btnX=0f
private var btnY=0f
init { initAttrs }
override fun onDraw {
canvas.drawCircle
canvas.drawCircle
}
override fun onTouchEvent: Boolean {
when{
MotionEvent.ACTION_DOWN,
MotionEvent.ACTION_MOVE ->{
updatePos
invalidate
return true
}
MotionEvent.ACTION_UP ->{
if reset
return true
}
}
return super.onTouchEvent
}
}
private final Handler handler = new Handler);
private final Runnable ticker = new Runnable {
@Override public void run {
notifyListener; // 每帧发送一次状态
handler.postDelayed; // 50ms 一次
}
};
@Override public boolean onTouchEvent{
if==MotionEvent.ACTION_DOWN){
handler.post;
}else if==MotionEvent.ACTION_UP){
handler.removeCallbacks;
}
return true;
}
"老友提醒":性Neng小技巧别忘记!哈哈哈~
# 避免在 onDraw 里 new 对象——尤其是 Paint、RectF 那种。提前缓存起来吧。
# 用 setLayerType*只在需要特殊混合模式时打开,否则硬件加速geng省电。
# 调整 ViewConfiguration#getScaledTouchSlop, 防止误触发小幅移动导致抖动感知错误。
end of story—咱们说完啦,你懂的吧?😁 Ru果还有啥不明白的,随时来砸我,我再慢慢捋捋代码细节~
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback