当前位置: 首页 > 编程日记 > 正文

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

本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下

一. 需求功能

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

实现的思路:

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文件

package com.bwie.BallViewDemo.customView;

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.view.WindowManager;

/**

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

*/

public class BallView extends View{

private Paint paint;

Context context;

//圆的初始位置坐标

private int x = 18;

private int y = 18;

private int radius = 188; //圆半径

/**

* java代码创建时调用

* @param context

*/

public BallView(Context context) {

super(context);

this.context = context;

}

/**

* xml创建时调用

* @param context

* @param attrs

*/

public BallView(Context context, AttributeSet attrs) {

super(context, attrs);

this.context = context;

}

/**

* 有style资源文件时调用

* @param context

* @param attrs

* @param defStyleAttr

*/

public BallView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

this.context = context;

}

/**

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

* @param canvas

*/

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

//用canvas将屏幕设为白色

canvas.drawColor(Color.WHITE);

//设置画笔颜色为红色

paint = new Paint();

paint.setColor(Color.RED);

//设置消除锯齿

paint.setAntiAlias(true);

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

//x :圆心的x坐标

//y :圆心的y坐标

//radius :圆的半径

//paint :画笔

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

}

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

@Override

public boolean onTouchEvent(MotionEvent event) {

//判断触摸点

switch (event.getAction()) {

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

case MotionEvent.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()获得的是相对屏幕的位置

case MotionEvent.ACTION_MOVE:

x = (int) event.getX();

y = (int) event.getY();

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

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

case MotionEvent.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);

int width = manager.getDefaultDisplay().getWidth();

int height = 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);

return true;

}

}

xml文件

xmlns:tools="http://schemas.android.com/tools"

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

package com.bwie.BallViewDemo;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.widget.RelativeLayout;

import com.bwie.BallViewDemo.customView.BallView;

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

public class BallActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//获取容器

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

//引用自定义控件

BallView ballView = new BallView(this);

//添加到容器

container.addView(ballView);

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章:

从试用到使用:计算机视觉产业新一轮发展的起步年

参加 2018 AI开发者大会&#xff0c;请点击官网报名 CSDN 出品的《2018-2019 中国人工智能产业路线图》V2.0 版即将重磅面世&#xff01; V1.0 版发布以来&#xff0c;我们有幸得到了诸多读者朋友及行业专家的鼎力支持&#xff0c;在此表示由衷感谢。此次 V2.0 版路线图将进行新…

被人恨,但感觉不错!

做销售四年多了&#xff0c;从来没有碰到目前遇到的情况&#xff0c;心中的郁闷&#xff0c;真的没办法排除&#xff0c;干脆写到BLOG上&#xff0c;也算发泄&#xff0c;也算记录&#xff01;早两三年&#xff0c;一直在软件和IT服务行业打混&#xff0c;接触的多是企业老总&a…

android联动动画,利用 CollapsingToolbarLayout 完成联动的动画效果

最近项目中需要实现个动画效果,研究了下这里做下简单的分享.效果图如下:示例.gif最初的想法是自己去利用 Android 的嵌套滚动机制,去实现上面的嵌套滚动效果.但最后为了开发效率直接利用了 CollapsingToolbarLayout 和 CoordinatorLayout 的效果.实现效果的原理十分简单,监听 C…

波士顿动力机器人逆天,人类已无法阻挡它的三级跳!

一直刷新大众认知的波士顿动力又秀出了新花样。 如今&#xff0c;波士顿动力的 Atlas 人形机器人可以玩跑酷了&#xff01;在该公司发布的一段最新视频中&#xff0c;Atlas 展示了它可以单脚越过障碍物、跳到交错的箱子上&#xff0c;毫不费力&#xff01; 该公司表示&#xff…

自制程序清除系统垃圾文件

电脑用久了&#xff0c;系统分区内肯定会有很多垃圾文件&#xff0c;占据着大量空间&#xff0c;严重影响系统运行速度&#xff0c;这个程序能自动清理电脑里的垃圾而不会破坏系统。1. 在桌面上点鼠标右键&#xff0c;新建一个文本文件&#xff0c;把下面的字复制进去&#xff…

pylons中常用的paster命令

paster create -t pylons helloworld 创建一个以pylons为模板的项目&#xff0c;项目名字是helloworldpaster create --list-templates 显示当前的pylons中有多少可以使用的模板 paster serve --reaload development.ini 最常用的命令了&#xff0c;启动调式程序的时候都…

What-If 工具:无需写代码,即可测试机器学习模型

文 / Google AI 软件工程师 James Wexler 构建有效的机器学习 (ML) 系统需要提出许多问题。仅仅训练一个模型&#xff0c;然后放任不管&#xff0c;是远远不够的。而优秀的开发者就像侦探一样&#xff0c;总是不断探索&#xff0c;试图更好地理解自己的模型&#xff1a;数据点的…

linux如何安装neo4j,Ubuntu16.04 如何安装neo4j数据库

什么是neo4j数据库&#xff1f;neo4j数据库是图数据库的一种&#xff0c;属于nosql的一种&#xff0c;常见的nosql数据库还有redis、memcached、mongDB等&#xff0c;不同于传统的关系型数据库&#xff0c;nosql数据也有其独特之处&#xff0c;例如图数据库&#xff0c;在处理对…

MSI文件制作全过程

MSI文件制作全过程 这两天学习制作MSI文件用于组策略发布&#xff0c;试了一些做.MSI文件的软件包括Win2000Server光盘带的WinINSTALL LE&#xff0c;实际做出来的效果都不好。最后找到InstallShield AdminStudio5&#xff0c;用它做的MSI文件在组策略中成功发布。下面就以“石…

C语言 带比较器的归并排序

1 #include <stdio.h>2 #include <stdlib.h>3 4 typedef int DataType;5 6 //比较器7 int mycmp(const void * a, const void *b); 8 9 //int (*compar)(const void *, const void *) 函数指针 10 void Sort(DataType * arr, int from, int to, int (*compar)(cons…

iphone adb android,通过ADB获取Android手机信息

1、获取手机体系信息(CPU&#xff0c;厂商名称等)adbshell”cat/system/build.prop|grep”product””2、获取手机体系版别adbshellgetpropro.build.version.release3、获取手机体系api版别adbshellgetpropro.build.version.sdk4、获取手机设备类型adb-dshellgetpropro.product…

浩方平台CS流量评估

因为需要做了一次这样的简单的流量评估,就顺便拿出来给大家共享一下转载于:https://blog.51cto.com/niujh/10164

深度学习深陷可解释性泥淖,而这个研究领域正逐步焕发生机

只讲技术&#xff0c;拒绝空谈&#xff01;2018 AI开发者大会精彩议程曝光》 福利 11月2日前购票&#xff0c;立享7折优惠&#xff01;更有学生专享福利&#xff01;扫码报名↓↓↓

php redis 安装和使用

为什么80%的码农都做不了架构师&#xff1f;>>> mac安装 redis $brew update $brew install redis > Downloading https://homebrew.bintray.com/bottles/redis-4. Already downloaded: /Users/lph/Library/Caches/Homebrew/redis-4.0.2.sierra.bottle.tar.gz &…

怎样在javascript函数中将变量传递给服务端脚本程序?

怎样在javascript函数中将变量传递给服务端脚本程序?(有朋友问上述问题, 愿把结论分享给大家).摘 要: 服务器端脚本运行时, 它只会解释执行<% %>或<?php ?%> 之间的脚本语句, 它会把客户端脚本视作 普通文本. 而客户端脚本运行时, 服务器端脚本又是不可见的(客…

android studio val,Kotlin学习笔记之const val与val

const的使用const 必须修饰valconst 只允许在top-level级别和object中声明&#xff0c;使用方式如下&#xff1a;const val THOUSAND 1000object myObject {const val constNameObject: String "constNameObject"}class MyClass {companion object Factory {const …

算法开发人员的安身之本:如何将机器学习与各行各业进行深度结合

只讲技术&#xff0c;拒绝空谈&#xff01;2018 AI开发者大会精彩议程曝光》 2018 AI开发者大会 2018 AI开发者大会是一场由中美人工智能技术高手联袂打造的AI技术与产业的年度盛会&#xff01;是一场以技术落地为导向的干货会议&#xff01;大会设置了10场技术专题论坛&#x…

android intent email,Android Email Intent

问题Ive set up two buttons. One opens the compose sms intent and the other opens the compose email intent. The sms intent works fine but the email button doesnt respond. Ive created a categorychooser but that doesnt show up....UNTIL I click the sms buttonT…

C#实现的18位×××格式验证算法

18位标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版&#xff0c;其中指出将原标准名称"社会保障号码"更名为"公民身份号码"&#xff…

大家都收藏了的最新开源项目Top12!CV、NLP、机器学习一应俱全

参加 2018 AI开发者大会&#xff0c;请点击大会官网 译者 | 林椿眄、Jane 责编 | Jane 出品 | AI科技大本营 【导读】作者整理了近期最新发布及更新的 12 个非常有学习和收藏意义的开源项目。这些项目中包括基于 TensorFlow 的强化学习框架&#xff1b;可以对数据进行结构化处…

CentOS6.5下Gunicorn+Django+nginx部署的过程

2019独角兽企业重金招聘Python工程师标准>>> 本文假设你已经在CentOS下使用Python manage.py runserver 0.0.0.0:8080&#xff0c;能够顺利跑起来&#xff0c;并且被外网访问到了。项目名假设为&#xff1a;blog_project 安装nginx yum -y install nginx 如果安装不…

c7pro android7,三星c7pro和iphone7哪个值得买?三星Galaxy c7 pro和苹果iphone7区别对比详细评测...

三星c7 pro介绍&#xff1a;三星C7 Pro三星C7 Pro可以看作是去年底上市的三星C9 Pro低配版&#xff0c;屏幕变小了&#xff0c;硬件配置也有所降低&#xff0c;不过配备了骁龙625升级版的骁龙626处理器&#xff0c;硬件方面也是颇具看点的&#xff0c;以下是手机详细参数。三星…

NIPS2018 | 腾讯AI Lab入选20篇论文,含2篇Spotlight

1.7亿条数据&#xff0c;比胡同和撸串更真实的北京35岁IT老兵&#xff0c;转型AI&#xff0c;我做错了吗&#xff1f;厉害了&#xff0c;天刚一冷程序员就都换上了衬衫……如何用Python&Fabric打造区块链“淘宝”商城Python 3 字符串中的 STR 和 Bytes 究竟有什么区别&…

windows查看端口占用以及关闭相应的进程

开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选"查看"-"选择列" 经常&#xff0c;我们在启动应用的时候发现系统需要的端…

bzoj 2730: [HNOI2012]矿场搭建——tarjan求点双

Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见&#xff0c;希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口&#xff0c;使得无论哪一个挖煤点坍塌之后&#xff0c;其他挖煤点的工人都有…

华为鸿蒙手机官网价格表,曝下半年华为将推出两款鸿蒙手机:国内独享,价格良心...

虽然发声表示自己将全力支持安卓系统&#xff0c;维护安卓生态&#xff0c;但又推出了鸿蒙操作系统&#xff0c;余承东还表示鸿蒙系统取代安卓系统只需要1-2天即可。从这番表态来看&#xff0c;华为应该后续是要安卓鸿蒙两手抓了。安卓系统照常使用&#xff0c;而鸿蒙系统也会进…

PocketPC 全屏的实现

在windows mobile 5.0中实现全屏的方法&#xff0c;和隐藏SIP的方法差不多&#xff0c;只要稍稍改一下就可以了&#xff1a;::CommandBar_Show(m_hWnd, FALSE);//隐藏菜单 ::SHFullScreen(m_hWnd,SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON);//隐藏taskbar与sipSetForegroundWindo…

AI时代,谈数据分析时我们要谈些什么?

参加 2018 AI开发者大会&#xff0c;请点击大会官网 说起数据分析&#xff0c;你能想到的是什么&#xff1f; 根据维基百科的定义&#xff0c;数据分析是一类统计方法&#xff0c;其主要特点是多维性和描述性。有些几何方法有助于揭示不同的数据之间存在的关系&#xff0c;并绘…

清瘦的记录者: 一个比dbutils更小巧、好用的的持久化工具

https://gitee.com/bitprince/memory 1. 概述 1.1 连接、语句和结果集 从JDBC的规范上看&#xff0c;其对数据访问层有相当简洁的抽象&#xff1a;1、连接(connection) 2、语句(statement)、3结果集(result set)。我们对数据库做的事情无非&#xff1a;连接数据库&#xff0c;执…

html 显示消息数量,html实现消息按钮上的数量角标的实例详解

这篇文章主要介绍了html在消息按钮上增加数量角标的实现代码,需要的朋友可以参考下html代码&#xff1a;消息4css代码&#xff1a;/*角标 */.ii{display: none;background: #f00;border-radius: 50%;width: 20px;height: 20px;top: 5px;right: 0px;position: absolute;text-ali…