一. 需求功能

手指在屏幕上滑动,红色的小球始终跟随手指移动。

实现的思路:

1)自定义View,在onDraw中画圆作为小球;

2)重写自定义View的onTouchEvent方法,记录触屏坐标,用新的坐标重新绘制小球;

3)在布局中引用自定义View布局,运行程序,实现跟随手指移动效果。

关键技术点

自定义View应用、触摸事件处理、canvas绘图、Paint应用。

实现步骤

1. 新建一个工程,命名为BallViewDemo,Activity命名为BallActivity;

2. 创建自定义View类BallView,自定义属性:ball_size;

新建attrs.xml文件,自定义属性ball_size,可以在布局文件里设置小球的大小

3. 继承View实现自定义View;

1)重写自定义View的三个构造方法

2)初始化自定义属性

3)对自定义属性对象做回收资源逻辑的处理

4. 实现onDraw()方法;

1) 用canvas将屏幕设为白色

2) 设置画笔颜色为红色

3) 绘制小圆作为小球,半径通过自定义属性设置

5. 实现onTouchEvent方法,处理触摸事件;

1) 实现MotionEvent.ACTION_DOWN,记录按下的x,y坐标

2) 实现MotionEvent.ACTION_MOVE 记录移动的x,y坐标

3) 实现MotionEvent.ACTION_UP 记录抬起的x,y坐标

4)使用 postInvalidate()方法实现重绘小球,跟随手指移动

三. 功能代码

第一种实现效果方式: 自定义View类BallView配合xml文件

pckagecom.bwie.BallViewDemo.customView;

importandroid.content.Context;

importandroid.graphics.Canvas;

importandroid.graphics.Color;

importandroid.graphics.Paint;

importandroid.util.AttributeSet;

importandroid.view.MotionEvent;

importandroid.view.View;

importandroid.view.WindowManager;

/**

* 自定义圆形小球view:手指在屏幕上滑动,红色的小球始终跟随手指移动。

*/

publicclassBallView extendsView{

privatePaint paint;

Context context;

//圆的初始位置坐标

privateintx = 18;

privateinty = 18;

privateintradius = 188; //圆半径

/**

* java代码创建时调用

* @param context

*/

publicBallView(Context context) {

super(context);

this.context = context;

}

/**

* xml创建时调用

* @param context

* @param attrs

*/

publicBallView(Context context, AttributeSet attrs) {

super(context, attrs);

this.context = context;

}

/**

* 有style资源文件时调用

* @param context

* @param attrs

* @param defStyleAttr

*/

publicBallView(Context context, AttributeSet attrs, intdefStyleAttr) {

super(context, attrs, defStyleAttr);

this.context = context;

}

/**

* 实现onDraw()方法实现绘图操作

* @param canvas

*/

@Override

protectedvoidonDraw(Canvas canvas) {

super.onDraw(canvas);

//用canvas将屏幕设为白色

canvas.drawColor(Color.WHITE);

//设置画笔颜色为红色

paint = newPaint();

paint.setColor(Color.RED);

//设置消除锯齿

paint.setAntiAlias(true);

//使用画笔绘制圆为小球

//x :圆心的x坐标

//y :圆心的y坐标

//radius :圆的半径

//paint :画笔

canvas.drawCircle(x,y,radius, paint);

}

//实现onTouchEvent方法,处理触摸事件

@Override

publicbooleanonTouchEvent(MotionEvent event) {

//判断触摸点

switch(event.getAction()) {

//实现MotionEvent.ACTION_DOWN,记录按下的x,y坐标:getRawX()和getRawY()获得的是相对屏幕的位置

caseMotionEvent.ACTION_DOWN:

x = (int) event.getX();

y = (int) event.getY();

System.out.println("按下时: "+ "x坐标:"+ event.getRawX() + "  "+ "y坐标:"+ event.getRawY());

//实现MotionEvent.ACTION_MOVE 记录移动的x,y坐标:getRawX()和getRawY()获得的是相对屏幕的位置

caseMotionEvent.ACTION_MOVE:

x = (int) event.getX();

y = (int) event.getY();

System.out.println("移动时: "+ "x坐标:"+ event.getRawX() + "  "+ "y坐标:"+ event.getRawY());

//实现MotionEvent.ACTION_UP 记录抬起的x,y坐标

caseMotionEvent.ACTION_UP:

// 获取当前触摸点的x,y坐标,为X轴和Y轴坐标重新赋值:getX()和getY()获得的永远是view的触摸位置坐标

x = (int) event.getX();

y = (int) event.getY();

System.out.println("抬起时: "+ "x坐标:"+ event.getRawX() + "  "+ "y坐标:"+ event.getRawY());

break;

}

//获取屏幕宽高

WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

intwidth = manager.getDefaultDisplay().getWidth();

intheight = manager.getDefaultDisplay().getHeight();

//修正圆点坐标,重新绘制圆 ,控制小球不会被移出屏幕

if(x >= 18&& y >= 18&& x <= width - 18&& y <= height - 18) {

/**

* Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:

1. Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。

invalidate()是用来刷新View的,必须是在UI线程中进行工作。比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。invalidate()的调用是把之前的旧的view从主UI线程队列中pop掉。

2.Android 程序默认情况下也只有一个进程,但一个进程下却可以有许多个线程。在这么多线程当中,把主要是负责控

制UI界面的显示、更新和控件交互的线程称为UI线程,由于onCreate()方法是由UI线程执行的,所以也可以把UI线程理解

为主线程。其余的线程可以理解为工作者线程。invalidate()得在UI线程中被调动,在工作者线程中可以通过Handler来通

知UI线程进行界面更新。而postInvalidate()在工作者线程中被调用。

*/

//使用 postInvalidate()方法实现重绘小球,跟随手指移动

postInvalidate();

}

/*

* 备注:此处一定要将return super.onTouchEvent(event)修改为return true,原因是:

* 1)父类的onTouchEvent(event)方法可能没有做任何处理,但是返回了false。

* 2)一旦返回false,在该方法中再也不会收到MotionEvent.ACTION_MOVE及MotionEvent.ACTION_UP事件。

*/

//return super.onTouchEvent(event);

returntrue;

}

}

xml文件

android:id="@+id/relativeLayout"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/ball"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

第二种实现效果方式: 功能代码中引用自定义View类BallView

packagecom.bwie.BallViewDemo;

importandroid.support.v7.app.AppCompatActivity;

importandroid.os.Bundle;

importandroid.widget.RelativeLayout;

importcom.bwie.BallViewDemo.customView.BallView;

/* 引用自定义控件,第二种:代码中引用 */

publicclassBallActivity extendsAppCompatActivity {

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//获取容器

RelativeLayout container = (RelativeLayout) findViewById(R.id.relativeLayout);

//引用自定义控件

BallView ballView = newBallView(this);

//添加到容器

container.addView(ballView);

}

}

html5跟随手指的小球,Android自定义圆形View实现小球跟随手指移动效果(详细介绍)...相关推荐

  1. android小球移动代码,Android自定义圆形View实现小球跟随手指移动效果

    本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下 一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在on ...

  2. android 帧动画监听,Android 动画(View动画,帧动画,属性动画)详细介绍

    0. 前言 Android动画是面试的时候经常被问到的话题.我们都知道Android动画分为三类:View动画.帧动画和属性动画. 先对这三种动画做一个概述: View动画是一种渐进式动画,通过图像的 ...

  3. Android 自定义圆形图片 CircleImageView

    1.效果预览 1.1.布局中写自定义圆形图片的路径即可 1.2.然后看一看图片效果 1.3.原图是这样的 @mipmap/ic_launcher 2.使用过程 2.1.CircleImageView源 ...

  4. Android自定义圆形进度条

    Android自定义圆形进度条 github地址:https://github.com/opq1289/CircleProgressView 效果图: 无动画: 有动画: 整圆: 切割圆: 具体步骤: ...

  5. android自定义进度条百分比跟着走,Android studio圆形进度条 百分数跟随变化

    本文实例为大家分享了Android studio圆形进度条展示的具体代码,供大家参考,具体内容如下 MainActivity import android.support.v7.app.AppComp ...

  6. Android 自定义圆形图片

    代码注释很多,简单说下思路,然后直接贴代码 1.截取选定图片中间区域(宽等于高的正方形) 2.按照控件大小进行缩放 3.画圆,设置paint.setXfermode(new PorterDuffXfe ...

  7. Android自定义圆形调色板,可设置属性

    最近做项目需要用到调色板功能,本着不重复造轮子的想法,找到一个比较好的实现方式:Android 仿PhotoShop调色板应用.拿给老大看,老大说要做成RGB效果,不要HSV,因为不需要黑白色.好吧, ...

  8. android自定义圆形进度条,实现动态画圆效果

    自定义圆形进度条效果图如下:应用场景如动态显示分数等. view的自定义属性如下attr.xml <?xml version="1.0" encoding="UTF ...

  9. android自定义圆形图像

    这篇博客给大家带来使用xfermode实现圆形图像.先看效果: 这里说下原理,先看下图: 这里src和dst分别表示不同的bitmap,上面的图片有16种类型,分别表示不同情况下的交集,这里我们需要使 ...

最新文章

  1. 八大排序算法的python实现(四)快速排序
  2. 运输pascal 90分程序
  3. C语言程序练习-L1-019 谁先倒 (15分)
  4. jzoj6801-NOIP2020.9.19模拟patrick【树状数组】
  5. 前端学习(1686):前端系列javascript基础面试总结
  6. html css模仿实例,HTML+CSS模仿大学网站主页
  7. 24点游戏详细截图介绍以及原型、Alpha、Beta对比
  8. spring-session(一)揭秘续篇
  9. kubernetes StatefulSet介绍
  10. 如果时光倒流,我会这样学java
  11. 二叉搜索树插入算法C#演示的代码
  12. 人脸 解锁 android开发,零基础开发Android人脸识别应用
  13. 第四届“云鼎奖”网络投票火热进行中——入围名单一览
  14. 为什么笔记本电脑自动关机_为什么我要放弃笔记本电脑
  15. 计算机绘制函数的应用,信息技术应用用计算机绘制函数图象 (4).pptx
  16. 布局Mac,QQ浏览器全面出击
  17. Sklearn学习笔记,LogisticRegression的用法详解
  18. App界面交互设计规范
  19. GPB | KaKs_Calculator 3.0:计算编码与非编码序列的选择压力
  20. 【云炬COMSOL模型】自己做的激光超声的COSMOL模型

热门文章

  1. GameofMir引擎架设传奇服务器【3:在服务器上架设引擎】
  2. 厦大 1395 组合
  3. 简单实现一下百度地图
  4. 旁注、目录越权、跨库、CDN绕过
  5. java 小球抛物线_小球抛物线运动
  6. 大数据职业理解_3大数据职业职位描述及其职业要求
  7. Java8新特性:等同 final 效果(Effectively Final)
  8. linux将多个文件打包成一个文件,将多个文件打包成一个shell
  9. c# wifi串口通信_在C#中实现串口通信的方法
  10. Spring Boot踩坑记之Whitelabel Error Page问题