androidコントロールは指に従って移動し、漁の達人効果に似ています.
5386 ワード
public class TestActivity extends AppCompatActivity {
private ImageView imageView;
private ImageView imageView2;
private Context context;
//defalut
private float dfFromDegrees = -90;
//
private float dfToDegrees = 90;
private ObjectAnimator animator;
//
private String propertyName = "rotation";
//
private long duration = 3000;
//
int RepeatCount = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
context = TestActivity.this;
initView();
initAnimator();
animatorStart();
}
//
private void initAnimator() {
animator = ObjectAnimator.ofFloat(imageView, propertyName, dfFromDegrees, dfToDegrees);
animator.setDuration(duration);
animator.setRepeatCount(RepeatCount);
animator.setRepeatMode(ValueAnimator.REVERSE);
}
private void initView() {
imageView = (ImageView) findViewById(R.id.image);
imageView2 = (ImageView) findViewById(R.id.image2);
imageView2.setVisibility(View.GONE);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
LogUtil.i("countAngle(ev):" + countAngle(ev));
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
LogUtil.i("ACTION_DOWN");
animatorCancel();
setImageView2TransLation(ev, true);
imageView.setRotation(countAngle(ev));
break;
case MotionEvent.ACTION_MOVE:
LogUtil.i("ACTION_MOVE");
animatorCancel();
imageView2.setVisibility(View.VISIBLE);
setImageView2TransLation(ev, true);
imageView.setRotation(countAngle(ev));
break;
case MotionEvent.ACTION_UP:
LogUtil.i("ACTION_UP");
imageView2.setVisibility(View.GONE);
setAnimatorDegrees(dfFromDegrees, dfToDegrees);
setImageView2TransLation(ev, false);
animatorStart();
break;
}
return super.dispatchTouchEvent(ev);
}
//
private float countAngle(MotionEvent event) {
// X
float clickX = event.getX();
// Y
float clickY = event.getY();
//imageView X
float viewX = imageView.getX() + imageView.getPivotX();
float viewY = imageView.getY() + imageView.getPivotY();
return getRotationBetweenLines(viewX, viewY, clickX, clickY);
}
// 2
private void setImageView2TransLation(MotionEvent ev, boolean isShow) {
imageView2.setTranslationX(ev.getX() - imageView2.getWidth() / 2);
imageView2.setTranslationY(ev.getY() - imageView2.getHeight());
imageView2.setVisibility(isShow ? View.VISIBLE : View.GONE);
}
//
private void setAnimatorDegrees(float fromDegrees, float toDegrees) {
animator = ObjectAnimator.ofFloat(imageView, propertyName, fromDegrees, toDegrees);
animator.setDuration(3000);
animator.setRepeatCount(-1);
animator.setRepeatMode(ValueAnimator.REVERSE);
}
//
private void animatorStart() {
if (animator != null)
animator.start();
}
//
private void animatorCancel() {
if (animator != null)
animator.cancel();
}
//centerX、centerY ,xInView、yInView
public int getRotationBetweenLines(float centerX, float centerY, float xInView, float yInView) {
double rotation = 0;
double k1 = (double) (centerY - centerY) / (centerX * 2 - centerX);
double k2 = (double) (yInView - centerY) / (xInView - centerX);
double tmpDegree = Math.atan((Math.abs(k1 - k2)) / (1 + k1 * k2)) / Math.PI * 180;
if (xInView > centerX && yInView < centerY) { //
rotation = 90 - tmpDegree;
} else if (xInView > centerX && yInView > centerY) //
{
rotation = 90 + tmpDegree;
} else if (xInView < centerX && yInView > centerY) { //
rotation = 270 - tmpDegree;
} else if (xInView < centerX && yInView < centerY) { //
rotation = 270 + tmpDegree;
} else if (xInView == centerX && yInView < centerY) {
rotation = 0;
} else if (xInView == centerX && yInView > centerY) {
rotation = 180;
}
return (int) rotation;
}
}