本文实例为大家分享了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实现小球跟随手指移动效果相关推荐

  1. android 跟随动画,Android实现View拖拽跟随手指移动效果

    今天想实现这个功能,但是网上搜索代码,都是利用setPadding,setMargin 等方法去实现的,这在Android 4.0 以前是没问题的,但是,android 4.0 后系统已经提供了更简单 ...

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

    一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在onDraw中画圆作为小球: 2)重写自定义View的onTouchEvent方法,记录触屏坐标,用 ...

  3. Android最简单的实现View拖拽跟随手指移动效果

    今天想实现这个功能,但是网上搜索代码,都是利用setPadding,setMargin 等方法去实现的,这在Android 4.0 以前是没问题的,但是,Android 4.0 后系统已经提供了更简单 ...

  4. Android自定义View,跟随手指滑动效果

    Android自定义View,实现跟随手指滑动效果, 效果如下: 一,重写onTouchEvent方法 最后返回true 二,在MotionEvent.ACTION_MOVE情况下改变自定义view ...

  5. android圆形点击效果,Android 三种方式实现自定义圆形页面加载中效果的进度条

    [实例简介] Android 三种方式实现自定义圆形页面加载中效果的进度条 [实例截图] [核心代码] ad376a86-a9aa-49bc-8cea-321bcff2c0c3 └── AnimRou ...

  6. android确认密码代码,Android自定义View实现验证码or密码输入框

    前言 最近项目中有支付功能,用户输入密码时要类似微信支付密码输入框的样式,本想直接copy网上的,但设计姐姐总是对样式挑三拣四,抽空自己自定义了一个,无奈之下抽空自定义了个,并把它贴到GitHub上供 ...

  7. android小球移动代码,Android中如何绘制一个跟随手指移动的小球

    Android中如何绘制一个跟随手指移动的小球 发布时间:2020-11-07 16:22:43 来源:亿速云 阅读:82 作者:Leah 本篇文章为大家展示了Android中如何绘制一个跟随手指移动 ...

  8. android dialog 动画代码,android 自定义dialog弹出和消失动画

    自定义dialog窗口,根据坐标可随意设置dialog显示位置,实现了窗口弹出动画 Java代码: package com.sunxu.org.IndividualityDialog; import ...

  9. Android 三种方式实现自定义圆形页面加载中效果的进度条

    转载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76872 一.通过动画实现 定义res/anim/loading.xml如 ...

最新文章

  1. ASP.NET ViewState 初探
  2. UG集成显卡 显示成烂面
  3. java set spliterator_Java HashSet spliterator() 方法
  4. [Spring5]IOC容器_Bean管理XML方式_注入集合类型属性
  5. mysql general clomun_关于MySQL索引index杂谈
  6. oracle 24756,关于ORA-24756: transaction does not exist的问题
  7. c++最快简洁提供http文件服务
  8. MemCache详细解读(转)
  9. 解决FastCGI 进程超过了配置的活动超时时限的问题
  10. 深海迷航创造模式中如何起飞火箭
  11. 使用 OpenGL 实现 RGB 到 YUV 的图像格式转换
  12. linux中的manifest的作用,Linux之puppet
  13. java bigdecimal.round_down,java BigDecimal 的 setScale() 方法的 BigDecimal.ROUND_DOWN 舍入模式的BUG,坑...
  14. 人员招聘与培训实务【2】
  15. Java小游戏-俄罗斯方块
  16. ubuntu命令行更新vscode
  17. 从几何角度理解反函数的导数
  18. 《2022汽车行业数字化厂商全景报告》发布
  19. 程序员的自我涵养,写好代码的实战经历分享
  20. 用打印指令设置Zebra Printer的IP地址(适用于GK888T带打印服务器的条码打印机)

热门文章

  1. OpenCV(基础补充)颜色空间HSV *args与**args(滑动条传参问题)
  2. 计算机视觉:Bag of words算法实现过程中出现错误及解决方案
  3. 在CentOS 6.9 x86_64的OpenResty 1.13.6.1上使用LuaRocks示例
  4. LFSR 和 m序列
  5. linux 系统调用 read,write和lseek 使用
  6. 初步判断内存泄漏方法
  7. C功底挑战Java菜鸟入门概念干货(一)
  8. 序列化模块--json模块--pickle模块-shelve模块
  9. [小明爬坑系列]AssetBundle原理介绍
  10. 编译u-boot时候,make distclean 出现rm:无法删除,****是一个目录