圆的变化(自定义动画,及自定义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 ...
随机推荐
- 16 级高代 II 思考题十的多种证明
16 级高代 II 思考题十 设 $V$ 是数域 $\mathbb{K}$ 上的 $n$ 维线性空间, $\varphi$ 是 $V$ 上的线性变换, 证明: $\varphi$ 的极小多项式 $m ...
- 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 ...
- Eclipse java项目将普通文件转化为Source文件的操作
前提:该项目中已经将原有的Source folder删除掉. 右键单击普通文件>Build path>Use as Source Folder.
- SpringBoot 整合使用dubbo
这里主要是按照teaey作者的spring-boot-starter-dubbo框架进行一些变化的使用 依赖包: <dependency> <groupId>com.aliba ...
- 【做题】apc001_f-XOR Tree——巧妙转化及dp
对树上的路径进行操作是十分难处理的事情.一开始的思路主要针对于\(a_i<=15\)这一特殊性质上.于是考虑了\(a_i<=1\)的情况,然而除了糊出一个适用范围极小的结论外,并没有什么用 ...
- MySQL删除数据库时无响应解决办法
删除远程主机上MySQL中的一个数据库时,远程主机一直在响应,无法正常删除. 这个问题的解决办法如下:在远程主机上登录MySQL,执行show full processlist;观察state和inf ...
- OAuth的MVC实现(微软)
LoginController中: 第三方登陆 public ActionResult LogOn() { string liveUrl = string.Format( "https:// ...
- Pandas 基础(2) - Dataframe 基础
上一节我们已经对 Dataframe 的概念做了一个简单的介绍, 这一节将具体看下它的一些基本用法: 首先, 准备一个 excel 文件, 大致内容如下, 并保存成 .csv 格式. 然后, 在 ju ...
- Mysql 函数使用记录(一)——DATEDIFF、CONCAT
当目前为止呢,个人对Mysql的函数没有进行过统一的学习使用,都是用到了再去学习.而近日开始学习Linux了,所以为了防止这段时期结束后,将此阶段期间遇到的Mysql函数遗忘,开始在此对其做一个简单的 ...
- 切片对象的demo
a = slice(, ) s = 'HelloWorld' print(a.indices(len(s))) for i in range(*a.indices(len(s))): print(s[ ...