* 触摸控件使其能够做一个放大缩小的动画.
* 我是在项目中有这样的需求就简单的实现了一下,今天做个记录.
/* *
* Created by Qin_Li_Yang on 2017/11/14.
* <p>
* 创建一个TouchFeedback类
* 这里使用单利模式,应该是可以的哈哈.
*/
public class TouchFeedback {
/**
* 缩放动画的单方面时长,假如是100,是指放大100,当手指离开缩小又是100.
*/
private int duration = 100;
/**
* 放大或者缩小的值
*/
private float aFloatBig = 1.2f;
/**
* 可以自己设定
*
* @param duration
* @param aFloatBig
*/
public void setDurationAndFloatBig(int duration, float aFloatBig) {
this.duration = duration;
this.aFloatBig = aFloatBig;
}
/**
* 私有构造
*/
private TouchFeedback() {
}
/**
* 定义回调的接口
*/
public interface TouchFeedbackListener {
void onFeedback(View view);
}
private static TouchFeedback touchFeedback = null;
public static TouchFeedback getTouchFeedbackInstance() {
if (touchFeedback == null) {
synchronized (TouchFeedback.class) {
if (touchFeedback == null) {
touchFeedback = new TouchFeedback();
}
}
}
return touchFeedback;
}
/**
* 触摸的监听
* @param touchFeedListener
* @param view
*/
public void setTouchFeedListener(final TouchFeedback.TouchFeedbackListener touchFeedListener, View view) {
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
scaleBig(v);
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
scaleSmall(v, true, touchFeedListener);
break;
case MotionEvent.ACTION_CANCEL:
scaleSmall(v, false, touchFeedListener);
break;
}
return true;
}
});
}
/**
* 恢复原形的动画
* @param v
* @param b
* @param touchFeedListener
*/
private void scaleSmall(final View v, boolean b, final TouchFeedbackListener touchFeedListener) {
ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(v, "ScaleX", aFloatBig, 1f).setDuration(duration);
ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(v, "ScaleY", aFloatBig, 1f).setDuration(duration);
objectAnimator2.start();
objectAnimator3.start();
if (b) {
/**动画执行的监听**/
objectAnimator2.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
/**
* 动画结束
* @param animation
*/
@Override
public void onAnimationEnd(Animator animation) {
touchFeedListener.onFeedback(v);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
}
/**
* 变大的动画
* @param v
*/
private void scaleBig(View v) {
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(v, "ScaleX", 1f, aFloatBig).setDuration(duration);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(v, "ScaleY", 1f, aFloatBig).setDuration(duration);
objectAnimator.start();
objectAnimator1.start();
}
}
* 简单使用
/**
* 实现刚才写的那个类里面的TouchFeedbackListener接口
*/
public class MainActivity extends AppCompatActivity implements TouchFeedback.TouchFeedbackListener {
private Button t1;
private Button t2;
private Button t3;
private Button t4;
private Button t5;
private Button t6;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
t1 = (Button) findViewById(R.id.t1);
t2 = (Button) findViewById(R.id.t2);
t3 = (Button) findViewById(R.id.t3);
t4 = (Button) findViewById(R.id.t4);
t5 = (Button) findViewById(R.id.t5);
t6 = (Button) findViewById(R.id.t6);
TouchFeedback touchFeedbackInstance = TouchFeedback.getTouchFeedbackInstance();
touchFeedbackInstance.setDurationAndFloatBig(300, 1.5f);
touchFeedbackInstance.setTouchFeedListener(this, t1);
touchFeedbackInstance.setTouchFeedListener(this, t2);
touchFeedbackInstance.setTouchFeedListener(this, t3);
touchFeedbackInstance.setTouchFeedListener(this, t4);
touchFeedbackInstance.setTouchFeedListener(this, t5);
touchFeedbackInstance.setTouchFeedListener(this, t6);
}
/**
* 这里像onclick一样
* @param view
*/
@Override
public void onFeedback(View view) {
switch (view.getId()) {
case R.id.t1:
Toast.makeText(this, "t1", Toast.LENGTH_LONG).show();
break;
case R.id.t2:
Toast.makeText(this, "t2", Toast.LENGTH_LONG).show();
break;
case R.id.t3:
Toast.makeText(this, "t3", Toast.LENGTH_LONG).show();
break;
case R.id.t4:
Toast.makeText(this, "t4", Toast.LENGTH_LONG).show();
break;
case R.id.t5:
Toast.makeText(this, "t5", Toast.LENGTH_LONG).show();
break;
case R.id.t6:
Toast.makeText(this, "t6", Toast.LENGTH_LONG).show();
break;
}
}
}
Android自定义view的触摸反馈
最新推荐文章于 2022-10-14 16:38:51 发布