圆的变化(自定义动画,及自定义UI)
之前在面试的时候被问到过一个问题,如何实现一个圆沿着一条线由大到小
当时回答的含糊不清,现在已经明白怎么去实现
关键点: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)的更多相关文章
- Android中自定义View和自定义动画
Android FrameWork 层给我们提供了很多界面组件,但是在实际的商业开发中这些组件往往并不能完全满足我们的需求,这时候我们就需要自定义我们自己的视图和动画. 我们要重写系统的View就必须 ...
- Android开发UI之自定义动画
自定义动画,需要新建一个类,继承Animation类. 重写applyTransformation()方法和initialize()方法. applyTransformation(float inte ...
- UI设计篇·入门篇·简单动画的实现,透明动画/旋转动画/移动动画/缩放动画,混合动画效果的实现,为动画设置监听事件,自定义动画的方法
基本的动画构成共有四种:透明动画/旋转动画/移动动画/缩放动画. 配置动画的方式有两种,一种是直接使用代码来配置动画效果,另一种是使用xml文档配置动画效果 相比而言,用xml文档写出来的动画效果,写 ...
- velocity自定义动画
话说好久没有写博客了,零星的整理了一些东西,没有形成系统,所以也没有在这里记录. 废话不多说了,进入今天的正题.不知道大家是否记得之前写过的一篇文章<制作炫酷的专题页面& ...
- Android 5.0自定义动画
材料设计中的动画对用户的操作给予了反馈,并且在与应用交互时提供了持续的可见性.材料主题提供了一些按钮动画和活动过渡,Android 5.0允许你自定义动画并且可以创建新的动画: Touch Feedb ...
- 用POP动画编写带富文本的自定义动画效果
用POP动画编写带富文本的自定义动画效果 [源码] https://github.com/YouXianMing/UI-Component-Collection [效果] [特点] * 支持富文本 * ...
- [Android]Fragment自定义动画、动画监听以及兼容性包使用
Fragment是Android在API 11之后加入的一个组件,对提高Android开发中的布局合理性和布局效率都有很大作用,尤其是在Android平板等大屏幕设备的开发中,Fragment的引入能 ...
- android 自定义动画
android自定义动画注意是继承Animation,重写里面的initialize和applyTransformation,在initialize方法做一些初始化的工作,在applyTransfor ...
- [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar
在做安卓UI的时候有时候需自定义具有动画效果的按钮或需要自定义一下actionbar~ 本节用一个简单的demo讲如何自定义具有动画效果的按钮,以及个性化的actionbar 下面是效果: 其中: △ ...
- AndroidUI 视图动画-自定义动画效果 (Animation)
如果Android提供的四种动画 效果 和混合动画效果 不能够 满足需求的话,可以使用自定义动画效果 : 新建一个类CustomAnimation 使其继承自 android.view.animati ...
随机推荐
- loj#2510. 「AHOI / HNOI2018」道路 记忆化,dp
题目链接 https://loj.ac/problem/2510 思路 f[i][a][b]表示到i时,公路个数a,铁路个数b 记忆化 复杂度=状态数=\(nlog^2n\) 代码 #include ...
- Git 配置命令设置
目录 查看配置文件路径: 查看其他配置命令: 修改配置文件默认路径: 查看配置文件路径: 查看系统级别配置: git config -e –-system D:/Program Files/Git/m ...
- Shell 基础知识和总结
调试脚本 检查脚本语法错误 bash -n /path/to/some_script 调试执行 bash -x /path/to/some_script shell里的变量 本地变量:只对当前shel ...
- Windows,远程计算机:X.X.X.X,这可能是由于CredSSP加密Oracle修正
https://blog.csdn.net/wyhwlls/article/details/80320301 近期window 10家庭版更新后,远程桌面连不到服务器了 网上有卸载补丁,修改组策略什么 ...
- 编译caffe的Python借口,提示:ImportError: dynamic module does not define module export function (PyInit__caffe)
>>> import caffeTraceback (most recent call last): File "<stdin>", line 1, ...
- Hyper-v虚拟机
Hyper-V1:创建和管理虚拟机 Hyper-V2:向VM增加虚拟硬盘 Hyper-V3:虚拟机的配置 使用Hyper-V创建虚拟机 Hyper-v 安装CentOS 7 (其他虚拟机一样参考)
- RabbitMQ学习之延时队列
原帖参考:http://www.cnblogs.com/telwanggs/p/7124687.html?utm_source=itdadao&utm_medium=referral http ...
- [转载]grep查看上下文及简单正则表达式
转载自:https://www.cnblogs.com/mfryf/p/3336288.html inux grep 显示前后几行的信息2016年03月02日 14:10:58 ChenHui246 ...
- How to install Bekeley Extension Software Switch(BESS)?
参考: Github BESS How to install Bekeley Extension Software Switch(BESS)? Introduction BESS is a modul ...
- JavaScript运行机制详解
JavaScript运行机制详解 var test = function(){ alert("test"); } var test2 = function(){ alert(& ...