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);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
android小球移动代码,Android自定义圆形View实现小球跟随手指移动效果相关推荐
- android 跟随动画,Android实现View拖拽跟随手指移动效果
今天想实现这个功能,但是网上搜索代码,都是利用setPadding,setMargin 等方法去实现的,这在Android 4.0 以前是没问题的,但是,android 4.0 后系统已经提供了更简单 ...
- html5跟随手指的小球,Android自定义圆形View实现小球跟随手指移动效果(详细介绍)...
一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在onDraw中画圆作为小球: 2)重写自定义View的onTouchEvent方法,记录触屏坐标,用 ...
- Android最简单的实现View拖拽跟随手指移动效果
今天想实现这个功能,但是网上搜索代码,都是利用setPadding,setMargin 等方法去实现的,这在Android 4.0 以前是没问题的,但是,Android 4.0 后系统已经提供了更简单 ...
- Android自定义View,跟随手指滑动效果
Android自定义View,实现跟随手指滑动效果, 效果如下: 一,重写onTouchEvent方法 最后返回true 二,在MotionEvent.ACTION_MOVE情况下改变自定义view ...
- android圆形点击效果,Android 三种方式实现自定义圆形页面加载中效果的进度条
[实例简介] Android 三种方式实现自定义圆形页面加载中效果的进度条 [实例截图] [核心代码] ad376a86-a9aa-49bc-8cea-321bcff2c0c3 └── AnimRou ...
- android确认密码代码,Android自定义View实现验证码or密码输入框
前言 最近项目中有支付功能,用户输入密码时要类似微信支付密码输入框的样式,本想直接copy网上的,但设计姐姐总是对样式挑三拣四,抽空自己自定义了一个,无奈之下抽空自定义了个,并把它贴到GitHub上供 ...
- android小球移动代码,Android中如何绘制一个跟随手指移动的小球
Android中如何绘制一个跟随手指移动的小球 发布时间:2020-11-07 16:22:43 来源:亿速云 阅读:82 作者:Leah 本篇文章为大家展示了Android中如何绘制一个跟随手指移动 ...
- android dialog 动画代码,android 自定义dialog弹出和消失动画
自定义dialog窗口,根据坐标可随意设置dialog显示位置,实现了窗口弹出动画 Java代码: package com.sunxu.org.IndividualityDialog; import ...
- Android 三种方式实现自定义圆形页面加载中效果的进度条
转载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76872 一.通过动画实现 定义res/anim/loading.xml如 ...
最新文章
- ASP.NET ViewState 初探
- UG集成显卡 显示成烂面
- java set spliterator_Java HashSet spliterator() 方法
- [Spring5]IOC容器_Bean管理XML方式_注入集合类型属性
- mysql general clomun_关于MySQL索引index杂谈
- oracle 24756,关于ORA-24756: transaction does not exist的问题
- c++最快简洁提供http文件服务
- MemCache详细解读(转)
- 解决FastCGI 进程超过了配置的活动超时时限的问题
- 深海迷航创造模式中如何起飞火箭
- 使用 OpenGL 实现 RGB 到 YUV 的图像格式转换
- linux中的manifest的作用,Linux之puppet
- java bigdecimal.round_down,java BigDecimal 的 setScale() 方法的 BigDecimal.ROUND_DOWN 舍入模式的BUG,坑...
- 人员招聘与培训实务【2】
- Java小游戏-俄罗斯方块
- ubuntu命令行更新vscode
- 从几何角度理解反函数的导数
- 《2022汽车行业数字化厂商全景报告》发布
- 程序员的自我涵养,写好代码的实战经历分享
- 用打印指令设置Zebra Printer的IP地址(适用于GK888T带打印服务器的条码打印机)
热门文章
- OpenCV(基础补充)颜色空间HSV *args与**args(滑动条传参问题)
- 计算机视觉:Bag of words算法实现过程中出现错误及解决方案
- 在CentOS 6.9 x86_64的OpenResty 1.13.6.1上使用LuaRocks示例
- LFSR 和 m序列
- linux 系统调用 read,write和lseek 使用
- 初步判断内存泄漏方法
- C功底挑战Java菜鸟入门概念干货(一)
- 序列化模块--json模块--pickle模块-shelve模块
- [小明爬坑系列]AssetBundle原理介绍
- 编译u-boot时候,make distclean 出现rm:无法删除,****是一个目录