Android之自定义View实现随手势滑动的小圆球

一直以来觉得自己只是个菜鸟,虽然公司的项目能轻易的完成,但是总感觉缺少什么。大家似乎都认为android很简单,其实我认为只是初级android简单,若想深入研究它,其实也是很有看头的。

看了任玉刚老师的博客明白了,若想进一步学习android,还是要学习自定义View的,要想做出自己想要的绚丽的View,还是要从底层做起,下一番狠功夫。

俗话说的好,“欲练神功,必先**”,其实说得很有道理。其实自己一直都对View这个重要的知识点还是很模糊的,貌似也是android的难点,为了能练得此神功,花了70块大洋买了任玉刚老师编写的书籍《Android开发艺术探索》,听说这本书的口碑很好,买来后感觉确实非常棒。

今天学习了最简单的一个demo,自定义View实现随手势滑动的小圆球,开始自己的自定义View学习之旅。

效果图:


一.新建一个CustomView,继承自ImageView:

public class CustomView extends ImageView {
    private int lastX;
    private int lastY;
    public CustomView(Context context) {
        this(context, null);
    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //获取屏幕的位置 xy值
        int tempX = (int) event.getRawX();
        int tempY = (int) event.getRawY();
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                int deltaX = tempX - lastX;
                int deltaY = tempY - lastY;
                Log.i("dali", "move:deltaX:" + deltaX + ",deltaY:" + deltaY);
                int translationX = (int) (ViewHelper.getTranslationX(this) + deltaX);
                int translationY = (int) (ViewHelper.getTranslationY(this) + deltaY);
                ViewHelper.setTranslationX(this,translationX);
                ViewHelper.setTranslationY(this,translationY);
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                break;

        }
        lastX = tempX;
        lastY = tempY;
        return true;
    }
}
可以看到,重写了onTouchEvent方法,通过event.getRawX和event.getRawY获取了相对于屏幕的坐标,因为这是要全屏滑动的,所以需要获取当前点击事件在屏幕中的坐标而不是相对于View自身的坐标。并且声明两个变量lastX和lastY,来记录View移动的初始值,通过两点的坐标,那么便能计算出位移,然后通过第三方库nineoldandroids来实现View的动画移动,最后再次记录lastX和lastY的值。

二.调用这个自定义View:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <com.dali.www.customviewdemo.CustomView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        android:background="@drawable/bg_circle_iv"/>
</RelativeLayout>
三.画一个背景为红色的圆:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="50dp"/>
    <solid android:color="@android:color/holo_red_light"/>
</shape>










  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值