实现一个能动的人是我对模仿《奇怪的大冒险》第一阶段的最后一步,这一段时间学会了许多的东西,见到了很多大坑,也顺利脱险了。而本文所说的|能动的人是基于ImageView打造的。在ImageView中我又给它添加了更多的属性来实现我想要的功能。

1>在实现过程中小人走动的实现是依靠AnimationDramble加载两张运动的图片来实现的。

2>实现过程中我写了一些私有变量,并且暴露部分接口来给外部控制。

3>其中的向左向右运动(X坐标移动)是以定时器Timer重新定义和清除实现的,由于Timer没有暂停,所以在每一次点击后我就重新定义一次全局变量Timer和Hander,从而改变了主线程UI的变化。

4>左右按键并没有监听它们的OnClickListener而是监听了它们的OnTouchListener。如果是按下就开启自定义view的Timer和运动动画,否则就关闭Timer和动画。

5>针对每次的运动距离我提供了一个ValueAnimator来实现平滑过渡(实际上效果并不好)

总而言之基本实现了它的一些要求。

具体代码如下:

1、游戏组主界面的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/activity_game_0_0"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/colorWhiteBackground"tools:context="com.example.app_damaoxian.Activity_game_0_0"><ImageViewandroid:id="@+id/game0_0back"android:scaleType="centerInside"android:layout_marginTop="5dp"android:layout_marginRight="5dp"android:layout_width="50dp"android:layout_height="50dp"android:clickable="true"android:background="@drawable/background_back"android:layout_alignParentTop="true"android:layout_alignParentStart="true" /><com.example.app_damaoxian.heroviewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_centerHorizontal="true"android:id="@+id/heroview" /><ImageViewandroid:clickable="true"android:id="@+id/herogoleft"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/background_goleft"android:layout_alignParentBottom="true"android:layout_alignParentStart="true" /><ImageViewandroid:clickable="true"android:id="@+id/iv_jump"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/background_jump"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"/><ImageViewandroid:clickable="true"android:id="@+id/herogoright"android:background="@drawable/background_goright"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_toEndOf="@+id/herogoleft" />
</RelativeLayout>

2、游戏主界面Activity的java代码:

package com.example.app_damaoxian;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;public class Activity_game_0_0 extends AppCompatActivity {private RelativeLayout relativeLayout;private ImageView herogoleft,herogoright,game0_0back,iv_jump;private boolean goRight;private heroview heroView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_game_0_0);relativeLayout=(RelativeLayout)findViewById(R.id.activity_game_0_0);relativeLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);initView();}private void initView(){herogoleft=(ImageView)findViewById(R.id.herogoleft);herogoright=(ImageView)findViewById(R.id.herogoright);game0_0back=(ImageView)findViewById(R.id.game0_0back);heroView=(heroview)findViewById(R.id.heroview);iv_jump=(ImageView)findViewById(R.id.iv_jump);game0_0back.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();overridePendingTransition(R.animator.fragment_in,R.animator.fragment_out);}});herogoright.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if (event.getAction()==MotionEvent.ACTION_DOWN){herogoright.setImageDrawable(getResources().getDrawable(R.drawable.thumb_dpad_right_pressed));heroView.startGoRight();goRight=true;}else if (event.getAction()==MotionEvent.ACTION_UP){herogoright.setImageDrawable(getResources().getDrawable(R.drawable.thumb_dpad_right));heroView.stopGoRight();}return true;}});herogoleft.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if (event.getAction()==MotionEvent.ACTION_DOWN){herogoleft.setImageDrawable(getResources().getDrawable(R.drawable.thumb_dpad_left_pressed));heroView.startGoLeft();goRight=false;}else if (event.getAction()==MotionEvent.ACTION_UP){herogoleft.setImageDrawable(getResources().getDrawable(R.drawable.thumb_dpad_left));heroView.stopGoLeft();}return true;}});iv_jump.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (goRight){heroView.startRight_updown();}else {heroView.startLeft_updown();}}});}@Overrideprotected void onDestroy() {heroView.clearAndcancelTimer();super.onDestroy();}
}

3、自定义view的Java代码,extends ImagView:

package com.example.app_damaoxian;import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;import java.util.Timer;
import java.util.TimerTask;/*** Created by 尽途 on 2017/4/22.*/public class heroview extends ImageView {private AnimationDrawable herogorightList,herogoleftList;private float heroWidth,heroHeight,heroX,heroY,currentX;private Timer goRightTimer,goLeftTimer;private TimerTask goRightTimerTask,goLeftTimerTask;private Handler handler;public heroview(Context context){super(context);initData();addDrawable();}public heroview(Context context, AttributeSet attributeSet){super(context,attributeSet);initData();addDrawable();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//setMeasuredDimension();super.onMeasure(widthMeasureSpec, heightMeasureSpec);}private void addDrawable(){setImageDrawable(getResources().getDrawable(R.drawable.stop));herogorightList=new AnimationDrawable();herogoleftList=new AnimationDrawable();herogorightList.addFrame(getResources().getDrawable(R.drawable.go_right),200);herogorightList.addFrame(getResources().getDrawable(R.drawable.go_right1),200);herogoleftList.addFrame(getResources().getDrawable(R.drawable.go_left),200);herogoleftList.addFrame(getResources().getDrawable(R.drawable.go_left1),200);herogorightList.setOneShot(false);herogoleftList.setOneShot(false);}private void initData(){heroWidth=getWidth();heroHeight=getHeight();heroX=getLeft();heroY=getTop();}private void newgoRightTimer(){goRightTimer=new Timer();handler=new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what){case 0:heroX=heroX+50f;break;case 1:heroX=heroX-50f;break;default:break;}ValueAnimator progressAnimatior=ValueAnimator.ofFloat(heroX-50f,heroX);setX(currentX);progressAnimatior.setDuration(200);progressAnimatior.setTarget(currentX);progressAnimatior.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {currentX=(float)animation.getAnimatedValue();invalidate();}});progressAnimatior.start();setX(heroX);super.handleMessage(msg);}};goRightTimerTask=new TimerTask() {@Overridepublic void run() {Message message=new Message();message.what=0;handler.sendMessage(message);}};}private void newgoLeftTimer(){goLeftTimer=new Timer();handler=new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what){case 0:heroX=heroX+50f;break;case 1:heroX=heroX-50f;break;default:break;}ValueAnimator progressAnimatior=ValueAnimator.ofFloat(heroX+50f,heroX);setX(currentX);progressAnimatior.setDuration(200);progressAnimatior.setTarget(currentX);progressAnimatior.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {currentX=(float)animation.getAnimatedValue();invalidate();}});progressAnimatior.start();setX(heroX);super.handleMessage(msg);}};goLeftTimerTask=new TimerTask() {@Overridepublic void run() {Message message=new Message();message.what=1;handler.sendMessage(message);}};}/*** 为外部提供了控制hero动作形态的内部接口*/public void startGoRight(){setImageDrawable(herogorightList);herogorightList.start();newgoRightTimer();goRightTimer.schedule(goRightTimerTask,0,200);}public void stopGoRight(){herogorightList.stop();clearAnimation();setImageDrawable(getResources().getDrawable(R.drawable.stop));goRightTimer.cancel();}public void startGoLeft(){setImageDrawable(herogoleftList);herogoleftList.start();newgoLeftTimer();goLeftTimer.schedule(goLeftTimerTask,0,200);}public void stopGoLeft(){herogoleftList.stop();clearAnimation();setImageDrawable(getResources().getDrawable(R.drawable.stop));goLeftTimer.cancel();}public void heroCry(){setImageDrawable(getResources().getDrawable(R.drawable.cry));}public void startLeft_updown(){if (herogoleftList.isRunning()){herogoleftList.stop();}setImageDrawable(getResources().getDrawable(R.drawable.left_updown));}public void startRight_updown(){if (herogorightList.isRunning()){herogorightList.stop();}setImageDrawable(getResources().getDrawable(R.drawable.right_updown));}public void clearAndcancelTimer(){if (goLeftTimer!=null){goLeftTimer.cancel();goLeftTimer=null;}if (goRightTimer!=null){goRightTimer.cancel();goRightTimer=null;}}
}

本例已上传至Github 欢迎Star https://github.com/zqljintu/qiguaidedamaoxian 点击打开链接

Android自定义一个View实现运动的小人相关推荐

  1. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  2. Android自定义一个车牌字母选择键盘

    在一般和车相关的应用,难免会和车牌打交道,组成车牌的要素,国内无非就是省份简称+地区代码+英文或者数字组成,比如京A12345,在需要输入车牌的功能上,就需要有省份简称键盘和英文数字键盘了,在上篇的文 ...

  3. android自定义组合view,自定义View之组合View

    前言 自定义View是安卓开发中比较重要的一环,很多地方都需要用到自定义View.而自定义View比较常见的一种形式就是组合View,也是比较简单的一种方式.下面通过一个实例来学习一下自定义组合vie ...

  4. Android自定义一个播放器控件

    介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...

  5. Android自定义一个可伸展的ViewGroup

    /   今日科技快讯   / 近日多家媒体报道,有认证为阿里巴巴集团的员工在职场社交平台称,"88VIP积分将可以免费兑换腾讯视频会员,已经在内部灰度测试,预计双十一前上线".但是 ...

  6. Android扑克牌抽奖View,android自定义层级view,扑克牌堆叠效果,cascadeLayout

    需要自定义一个组件CascadeLayout,让子view可以像拿扑克牌那样的层叠起来,主要实现效果: 为了设置子view之前的偏移距离,这里需要定义子view相对于上一张卡片的的左边距,上边距.然后 ...

  7. Android自定义一个省份简称键盘

    hello啊各位老铁,这篇文章我们重新回到Android当中的自定义View,其实最近一直在搞Flutter,初步想法是,把Flutter当中的基础组件先封装一遍,然后接着各个工具类,列表,网络,统统 ...

  8. Android自定义一个属于自己的时间钟表

    1.概述 本文主要讲解的是如何自定义一个时间钟表,通过简单的练习可以简单学习android当中自定义view的一些常用绘图技巧,优化android绘图操作.言归正传,首先看下我们需要实现的效果: 当我 ...

  9. Android 自定义动画view(小变大,旋转,色值)

    也不知道到看了多少的动画总结了,但是用到的时候太少,过段时间就会忘记了. 既然如此,我选择直接去动手学习,步步进阶. 效果: 上代码之前我们分析一下才会加深自己的印象: 需要画一个矩形 和 一个圆形 ...

最新文章

  1. Log4j官方文档翻译(一、基本介绍)
  2. Calc3: Geometrics
  3. 王道计算机考研 计算机组成原理 第一章、计算机系统概述
  4. python相关性分析的散点图怎么做_Python:matplotlib 和 Seaborn 之散点图和相关性 (三十二)...
  5. 微型计算机原理综合实验,微机原理综合实验指导书
  6. Compound Words UVA - 10391(c++用法中substr函数用法+map实现)
  7. mysql 5.6 ibdata1_mysql 里的 ibdata1 文件不断的增长?
  8. 燃烧我的卡路里 ---- Flutter瘦内存瘦包之图片组件
  9. springboot日志管理_最近Springboot有点火,只是因为面试问的频率高吗?
  10. 南天PR2、PR2E驱动下载,xp,win7,win8,win8.1,win10 32位64位驱动下载安装教程
  11. J2EE(集合框架)
  12. flutter 修改app名字和图标(安卓)
  13. Eclipse下载以及旧版本下载
  14. 从程序员到项目经理(29):怎样写文档
  15. c语言程序设计第二张答案,自学考试《C语言程序设计》习题及答案_第2页
  16. 绝对干货!初学者也能看懂的DPDK解析
  17. canvas教程2-canvas的编程思想
  18. JVM(1)之JVM的组成详解(字符串常量池+双亲委派机制+JIT即时编译......)
  19. 《元宇宙2086》亮相金鸡奖中国首部元宇宙概念院线电影启动
  20. 深入理解iOS APP启动过程

热门文章

  1. 使用聊天机器人做客服工作是一种什么体验?
  2. torch.sigmoid、torch.nn.Sigmoid和torch.nn.functional.sigmoid的区别
  3. 【Windows】ping ip+端口
  4. 练习print函数的使用(python)
  5. 山东女子学院计算机专业分数线,山东女子学院历年录取分数线汇总、
  6. OpenGL着色器透视变换实例-通过旋转平移调试着色器
  7. 《智能语音时代》的读书笔记
  8. 题目:L1-079 天梯赛的善良
  9. csdn 快速制作动态gif 插图
  10. 大学英语综合教程三 Unit 8 课文内容英译中 中英翻译