Android按钮移动的同时可以进行缩放动画吗

u011433995 2014-03-30 12:33:37
最近在看动画效果类,然后自己写了个Button的ontouch事件,并且在action_down中播放缩放动画,效果是有,不过就是花屏啊!请问大神们我的这种想法是否可行?若可行是哪里的问题,若不行则其他方法是什么?
package com.movebutton;

import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import android.view.Window;
import android.widget.ImageButton;
import android.widget.TextView;

public class MainActivity extends Activity implements OnTouchListener,
OnClickListener {

private ImageButton moveButton;
private int screenW, screenH;
private int downX, downY;
private TextView tv;
ScaleAnimation animation;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

DisplayMetrics dm = getResources().getDisplayMetrics();
screenW = dm.widthPixels;
screenH = dm.heightPixels;
moveButton = (ImageButton) this.findViewById(R.id.moveButton);
tv = (TextView) this.findViewById(R.id.textView1);
moveButton.setOnTouchListener(this);
animation = new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
animation.setDuration(1000);// 设置动画持续时间
// animation.setRepeatCount(int repeatCount);//设置重复次数
animation.setFillAfter(true);// 动画执行完后是否停留在执行完的状态
// animation.setStartOffset(long startOffset);//执行前的等待时间
}

@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// 点击时按钮所在位置
downX = (int) event.getRawX();
downY = (int) event.getRawY();
v.startAnimation(animation);
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - downX;
int dy = (int) event.getRawY() - downY;
int left = v.getLeft() + dx;
int top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;

// 判断移动是否超出屏幕

if (left < 0) {
left = 0;
right = left + v.getWidth();
}
if (top < 0) {
top = 0;
bottom = top + v.getHeight();
}
if (right > screenW) {
right = screenW;
left = right - v.getWidth();
}
if (bottom > screenH) {
bottom = v.getHeight();
top = screenH - v.getHeight() + v.getHeight();
}

downX = (int) event.getRawX();
downY = (int) event.getRawY();

v.layout(left, top, right, bottom);
v.postInvalidate();
// tv.setText("左:"+left+"上:"+top+"右:"+right+"下:"+bottom);
Log.e("", "左:" + left + "上:" + top + "右:" + right + "下:" + bottom
+ "高:" + screenH);
break;
case MotionEvent.ACTION_UP:
// animation.cancel();
break;
}
return false;
}

@Override
public void onClick(View v) {

}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
int contentTop =
getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
Rect rect = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top; //此处获取的是状态栏的高度;
int contentViewTop =
window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
//此处获取的是状态栏和标题栏的总高度;
//获取了状态栏和标题栏的总高度,也获取到了状态栏的高度,那么标题栏的高度就是:
int titleBarHeight = contentViewTop - statusBarHeight;
super.onWindowFocusChanged(hasFocus);
}
}
...全文
91 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧