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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/relativeLayout"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >

 <!-- 引用自定义控件,第一种:xml中引用-->
   <!-- 自定义控件的全类名 -->
 <com.bwie.BallViewDemo.customView.BallView
  android:id="@+id/ball"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />
</RelativeLayout>

第二种实现效果方式: 功能代码中引用自定义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实现移动小球和CircularReveal页面切换动画实例代码
  • Android自定义控件实现随手指移动的小球
  • Android View移动的六种方法小结
  • Android中利用matrix 控制图片的旋转、缩放、移动
  • js判断客户端是iOS还是Android等移动终端的方法
  • android实现关闭或开启移动网络数据
  • Android实现循环平移动画示例
(0)

相关推荐

  • Android实现循环平移动画示例

    实现用一张背景图做循环从左往右平移动画. 1.实现两个animation xml文件,一个起始位置在-100%p ,一个在0%p.设置repeat属性为循环,重复. 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolato

  • android实现关闭或开启移动网络数据

    如下所示: 复制代码 代码如下: //android关闭或开启移动网络数据(关闭后,设备不可以上网,但可以打电话和发短信)       public void setMobileDataEnabled(boolean enabled)     {        ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);        cm.setMobileDataEn

  • Android View移动的六种方法小结

    在android开发中,经常会遇到一个view需要它能够支持滑动的需求.下面通过本篇文章给大家介绍android view移动的六种方法. layout() 如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. public class DragView extends View{ private int lastX; private int lastY; public DragView(Context cont

  • Android实现拖动小球跟随手指移动效果

    Android拖动小球跟随手指移动Demo,供大家参考,具体内容如下 1.使用的知识点有自定义View,利用Canvas画球: 2.使用触摸时间来操作: 效果图: 代码如下: 1.自定义view: public class DrawView extends View { public float currentX = 50; public float currentY = 50; public DrawView(Context context) { super(context); } publi

  • Android中利用matrix 控制图片的旋转、缩放、移动

    本文主要讲解利用android中Matrix控制图形的旋转缩放移动,具体参见一下代码: 复制代码 代码如下: /**  * 使用矩阵控制图片移动.缩放.旋转  */  public class CommonImgEffectView extends View { private Context context ;      private Bitmap mainBmp , controlBmp ;      private int mainBmpWidth , mainBmpHeight , c

  • Android自定义控件实现随手指移动的小球

    一个关于自定义控件的小Demo,随着手指移动的小球. 先看下效果图: 实现代码如下: 1.自定义控件类 package com.dc.customview.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import

  • Android实现移动小球和CircularReveal页面切换动画实例代码

    前言 本文主要给大家介绍了关于Android如何实现移动小球和CircularReveal页面切换动画的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 效果图如下 是在fragment中跳转activity实现的效果,fragment跳fragment,activity跳activity类似~~ 实现过程 重写FloatingActionButton的onTouchListener()方法,使小球可以移动,并判断边界 点击fab时记录坐标传到下一个页面,在下一个页面展

  • js判断客户端是iOS还是Android等移动终端的方法

    判断原理: JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一种是通过分析浏览器的userAgent属性来判断的.在许多情况下,值判断出浏览器类型之后,还需判断浏览器版本才能处理兼容性问题,而判断浏览器的版本一般只能通过分析浏览器的userAgent才能知道. 浏览器类型 ⑴浏览器特有属性 ⑵根据userAgent 浏览器版本 ⑴根据userAge

  • Android自定义圆形View实现小球跟随手指移动效果

    本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下 一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在onDraw中画圆作为小球: 2)重写自定义View的onTouchEvent方法,记录触屏坐标,用新的坐标重新绘制小球: 3)在布局中引用自定义View布局,运行程序,实现跟随手指移动效果. 关键技术点 自定义View应用.触摸事件处理.canvas绘图.Paint应用. 实现步骤 1. 新建一个工程

  • Android实现View拖拽跟随手指移动效果

    今天想实现这个功能,但是网上搜索代码,都是利用setPadding,setMargin 等方法去实现的,这在Android 4.0 以前是没问题的,但是,android 4.0 后系统已经提供了更简单的方法给我们用了,就是setTranslationX() 和setTranslationY() .这两个是View的属性方法.现在我就用这两个方法实现一个View可以跟着手指移动拖拽的效果.代码非常非常简单: public class DragView extends TextView { floa

  • Android自定义View圆形和拖动圆、跟随手指拖动效果

    单纯的自定义一个圆非常简单 只需要几步就完成 拖动圆添加实现触摸事件即可 我在第一次自定义View圆遇到的几个Bug: 1.拖动圆的话在xml里面设置的自定义圆的宽和高是它能活动的空间的大小 不是圆控件的大小 如果你定义了100dp 拖动它的时候超过100dp这个距离这个圆就会看不见 就像下面这样 如果想活动于整个屏幕直接给宽和高match_parent属性就好了 2.我在定义充满属性match_parent的时候运行会报错,什么方法都用了就是不行,耐心等待过一会就好了-有可能是studio没来

  • Android自定义View圆形和拖动圆跟随手指拖动

    单纯的自定义一个圆非常简单 只需要几步就完成 拖动圆添加实现触摸事件即可 我在第一次自定义View圆遇到的小问题: 1.拖动圆的话在xml里面设置的自定义圆的宽和高是它能活动的空间的大小 不是圆控件的大小 如果你定义了100dp 拖动它的时候超过100dp这个距离这个圆就会看不见 就像下面这样 如果想活动于整个屏幕直接给宽和高match_parent属性就好了 2.在布局里自定的view会提示编译 点击Build编译一下就好了 下面开始写代码: 先是单纯的创建一个圆形 创建一个类继承View 实

  • Android中View跟随手指滑动效果的实例代码

    本文讲述了Android中View跟随手指滑动效果的实例代码.分享给大家供大家参考,具体如下: 1.android View 主要6种滑动方法,分别是 layout() offsetLeftAndRight()和offsetTopAndBottom() LayoutParams scrollBy()和 scrollTo() Scroller 动画 2.实现效果图 3.自定义中使用layout()方法实习view的滑动 public class MoveView extends View { pr

  • Android中View跟随手指移动效果

    最近做了一个项目中,其中遇到这样的需求要求图片移动到手指触碰的地方.具体实现代码如下所示: package com.example.plane; import Android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.Display; import android.view.KeyEvent; import android.view.Menu; i

  • Android 自定义圆形带刻度渐变色的进度条样式实例代码

    效果图 一.绘制圆环 圆环故名思意,第一个首先绘制是圆环 1:圆环绘制函数 圆环API public void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 参数说明 oval:圆弧所在的椭圆对象. startAngle:圆弧的起始角度. sweepAngle:圆弧的角度. useCenter:是否显示半径连线,true表示显示圆弧与圆心的半径连线,false表示不

  • Android 自定义圆形头像CircleImageView支持加载网络图片的实现代码

    在Android开发中我们常常用到圆形的头像,如果每次加载之后再进行圆形裁剪特别麻烦.所以在这里写一个自定义圆形ImageView,直接去加载网络图片,这样的话就特别的方便. 先上效果图 主要的方法 1.让自定义 CircleImageView 继承ImageView /** * 自定义圆形头像 * Created by Dylan on 2015/11/26 0026. */ public class CircleImageView extends ImageView { } 2.在构造方法中

  • android自定义圆形倒计时显示控件

    本文实例为大家分享了android自定义圆形倒计时显示控件的具体代码,供大家参考,具体内容如下 先上效果图 - 倒计时结束 代码块 attr.xml 控件需要用到的属性: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CountDownView"> <!--颜色--> <attr name

随机推荐