之前在面试的时候被问到过一个问题,如何实现一个圆沿着一条线由大到小

当时回答的含糊不清,现在已经明白怎么去实现

关键点:Paint,path,canvas

一种方法

在activity中去控制圆的x,y坐标点 还有圆的直径。

在activity中写一个Timer 定时器,定时去绘制这个圆view。

圆view继承自view ,将变化接口暴露出去即可,重写onDrow函数,根据x y 轴重绘

上代码吧

public class ChangedCirclerView extends View {
private Paint mPaint;
private int BALL_SIZE; //圆的坐标
private int ballX;
private int ballY; public ChangedCirclerView(Context context){
super(context);
initView();
} public ChangedCirclerView (Context context,int mballX, int mballY){
super(context);
initView();
ballX = mballX;
ballY = mballY;
} public ChangedCirclerView(Context context, AttributeSet attributeSet){
super(context,attributeSet);
initView();
} private void initView(){
mPaint = new Paint();
} public void invalidateBall(int mBallX,int mBallY,int mBallRadiu) {
ballX = mBallX;
ballY = mBallY;
BALL_SIZE = mBallRadiu; invalidate();
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} @Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.rgb(255,215,0));
mPaint.setAntiAlias(true); canvas.drawCircle(ballX,ballY,BALL_SIZE,mPaint); }
}

然后是acitivity  timer 控制代码

public class BallMoveActivity extends AppCompatActivity {
private Context context;
//小球初始的 X Y坐标点
private int baseX = 20;
private int baseY = 20;
private int baseRadiu = 10; //定义球的两个方位速度
private int xSpeed = 10;
private int ySpeed = 30;
private int radiuSpeed = 5; private int windowWidth ;
private int windowHight ; private int ON_DRAW = 0; private ChangedCirclerView circlerView; private FrameLayout frameLayout; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
frameLayout = (FrameLayout) findViewById(R.id.activity_main);getWindowXY();
getWindowXY(); initTimer();
} public void getWindowXY(){
WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
windowWidth = windowManager.getDefaultDisplay().getWidth();
windowHight = windowManager.getDefaultDisplay().getHeight();
} private void initTimer(){
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
baseX += xSpeed;
baseY += ySpeed;
baseRadiu += radiuSpeed; Log.v("xy==",String.valueOf(baseX)+"...."+baseY); Message message = new Message();
message.what = ON_DRAW;
handler.sendMessage(message);
}
},0,100);
} public Handler handler = new Handler(){ @Override
public void handleMessage(Message msg) {
if(msg.what == ON_DRAW){
if(circlerView == null){
circlerView = new ChangedCirclerView(context,baseX,baseY);
frameLayout.addView(circlerView);
} if(baseX > windowWidth || baseY >windowHight){
baseX = 20;
baseY = 20;
baseRadiu = 10;
} circlerView.invalidateBall(baseX,baseY,baseRadiu); }
}
}; }

这样就能根据x y 轴控制圆的位置,还有直径控制圆的大小了

方法二

还有一种方法就是动画的方式

需要一个圆的图形,可以是自己的Drawable图片,也可以是自己绘制的

然后编写动画代码,translate动画,scale动画,这样就能定义一个圆从哪里到哪里,然后圆的大小怎么变化这样的需求

圆的变化(自定义动画,及自定义UI)的更多相关文章

  1. Android中自定义View和自定义动画

    Android FrameWork 层给我们提供了很多界面组件,但是在实际的商业开发中这些组件往往并不能完全满足我们的需求,这时候我们就需要自定义我们自己的视图和动画. 我们要重写系统的View就必须 ...

  2. Android开发UI之自定义动画

    自定义动画,需要新建一个类,继承Animation类. 重写applyTransformation()方法和initialize()方法. applyTransformation(float inte ...

  3. UI设计篇·入门篇·简单动画的实现,透明动画/旋转动画/移动动画/缩放动画,混合动画效果的实现,为动画设置监听事件,自定义动画的方法

    基本的动画构成共有四种:透明动画/旋转动画/移动动画/缩放动画. 配置动画的方式有两种,一种是直接使用代码来配置动画效果,另一种是使用xml文档配置动画效果 相比而言,用xml文档写出来的动画效果,写 ...

  4. velocity自定义动画

         话说好久没有写博客了,零星的整理了一些东西,没有形成系统,所以也没有在这里记录.        废话不多说了,进入今天的正题.不知道大家是否记得之前写过的一篇文章<制作炫酷的专题页面& ...

  5. Android 5.0自定义动画

    材料设计中的动画对用户的操作给予了反馈,并且在与应用交互时提供了持续的可见性.材料主题提供了一些按钮动画和活动过渡,Android 5.0允许你自定义动画并且可以创建新的动画: Touch Feedb ...

  6. 用POP动画编写带富文本的自定义动画效果

    用POP动画编写带富文本的自定义动画效果 [源码] https://github.com/YouXianMing/UI-Component-Collection [效果] [特点] * 支持富文本 * ...

  7. [Android]Fragment自定义动画、动画监听以及兼容性包使用

    Fragment是Android在API 11之后加入的一个组件,对提高Android开发中的布局合理性和布局效率都有很大作用,尤其是在Android平板等大屏幕设备的开发中,Fragment的引入能 ...

  8. android 自定义动画

    android自定义动画注意是继承Animation,重写里面的initialize和applyTransformation,在initialize方法做一些初始化的工作,在applyTransfor ...

  9. [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar

    在做安卓UI的时候有时候需自定义具有动画效果的按钮或需要自定义一下actionbar~ 本节用一个简单的demo讲如何自定义具有动画效果的按钮,以及个性化的actionbar 下面是效果: 其中: △ ...

  10. AndroidUI 视图动画-自定义动画效果 (Animation)

    如果Android提供的四种动画 效果 和混合动画效果 不能够 满足需求的话,可以使用自定义动画效果 : 新建一个类CustomAnimation 使其继承自 android.view.animati ...

随机推荐

  1. log4j2使用介绍

    工作中,用到了log4j2,以前只接触过log4j,也没有太过深入,这次就稍微系统的学习了以下log4j2. 一.引入pom.xml 使用maven作为项目的构建环境,pom.xml使用slf4j,s ...

  2. Selenium Webdriver wait for JavaScript JQuery and Angular

    Hi all, during the last two weeks I was dealing with the best solution to wait for both JQuery, Angu ...

  3. vs 附加进程 iis进程显示

  4. 题解——loj6280 数列分块入门4 (分块)

    分块维护一个区间和 然后记得更新的时候左边角块的tag不要打错到右边角块 #include <cstdio> #include <algorithm> #include < ...

  5. Dockerize PostgreSQL

    Dockerize PostgreSQL Installing PostgreSQL on Docker Assuming there is no Docker image that suits yo ...

  6. c# 重试机制

    protected async Task<T> TryOperation<T>(int maxRetryCount,Func<Task<T>> func ...

  7. Spring Boot 发布方法 - 原创

    发布方式 构建Jar包,cmd命令行运行Spring Boot程序 第一步:在pom.xml中将packing节点值修改为jar,如下面加粗部分: <groupId>com.example ...

  8. HDU 4557 Tree(可持久化字典树 + LCA)

    http://acm.hdu.edu.cn/showproblem.php?pid=4757 题意: 给出一棵树,每个结点有一个权值,现在有多个询问,每次询问包含x,y,z三个数,求出在x到y的路径上 ...

  9. 【Java】【线程】

    /* 栗子 通过Runnable接口实现简历线程实例 */ class Dog implements Runnable{ //重写run函数 public void run(){ int times ...

  10. sql 中常见的控制流语句

    控制流语句:1 begin .....end  2 if ...else  例如:if exists (select * from 表名称 ) begin selct * from  表名称 end  ...