android 平移缩放动画,【安卓】自定义基于onDraw的随便动画(不仅仅是平移/旋转/缩放/alpha)、...

【安卓】自定义基于onDraw的任意动画(不仅仅是平移/旋转/缩放/alpha)、!

思路:

1.基于时间的显示映射。如:给定度数,显示圆弧,加上时序,即可有圆弧动画的效果

2.给定时序。用于驱动动画的一帧帧绘制

方案一、基于ObjectAnimator。动画运作时会调用degree对应set函数(基于放射调用),即setDegree。

ObjectAnimator ani=ObjectAnimator.ofInt(myView, "degree", 0,300);

ani.start();

注:1>混编后,默认会将setDegree混掉,导致找不到函数,故混编后这种机制会失效。解决方法是1.proguard中防止该段代码混编(具体方法百度) 2.使用方法二

2>ObjectAnimator在3.0后才支持,可使用NineOldAndroids库,效果完全一样。

方案二、仍然基于ObjectAnimator。但基于回调,这种方法未用到反射,故混编时仍ok

ObjectAnimator ani=ObjectAnimator.ofInt(myView, new Prop(), 0,300);

ani.start();

class Prop extends Property {

public Prop() {

// TODO Auto-generated constructor stub

super(Integer.class, "kk");

}

@Override

public void set(View object, Integer value) {

// TODO Auto-generated method stub

((MyView1)object).setDegree(value);

}

@Override

public Integer get(View object) {

// TODO Auto-generated method stub

return null;

}

};

方案三、用animation提供时序。interpolatedTime为0~1,即时间的百分比。

Animation ani=new Animation() {

@Override

protected void applyTransformation(float interpolatedTime,

Transformation t) {

// TODO Auto-generated method stub

myView.setDegree((int)(interpolatedTime*300f));

}

};

ani.setDuration(3000);

myView.startAnimation(ani);

//===========================================================================

自定义视图,setDegress可改变圆弧角度:

private class MyView1 extends ImageView {

public int degree = 0;

public MyView1(Context ct) {

// TODO Auto-generated constructor stub

super(ct);

}

@Override

protected void onDraw(Canvas canvas) {

// TODO Auto-generated method stub

super.onDraw(canvas);

Rect r = new Rect();

getLocalVisibleRect(r);

canvas.drawArc(new RectF(r), 0, degree, true, pt);

}

public void setDegree(int degree) {

this.degree = degree;

invalidate();

}

}

效果:

144524127.png   

144524128.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要实现在SurfaceView上进行缩放平移,需要使用GestureDetector类来监听手势事件。以下是大致的实现步骤: 1. 在SurfaceView上覆盖一个透明的View,用于捕获手势事件。 2. 在Activity或Fragment中实现GestureDetector.OnGestureListener接口,重写相关方法,比如onScroll()、onDoubleTap()、onScale()等。 3. 在SurfaceView的回调方法中,处理手势事件,并根据手势事件的不同类型进行相应的缩放平移操作,例如使用Canvas的缩放平移方法scale()和translate()来实现。 4. 为了避免SurfaceView的重绘导致的卡顿,可以将缩放平移操作放在一个独立的线程中执行。 下面是一个简单的代码示例,供参考: ```java public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private GestureDetector mGestureDetector; private float mScaleFactor = 1.0f; private float mTranslateX = 0.0f; private float mTranslateY = 0.0f; public MySurfaceView(Context context) { super(context); init(context); } public MySurfaceView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } private void init(Context context) { mGestureDetector = new GestureDetector(context, new MyGestureListener()); getHolder().addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { // 初始化SurfaceView } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // SurfaceView大小发生变化 } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 释放资源 } @Override public boolean onTouchEvent(MotionEvent event) { // 将手势事件交给GestureDetector处理 return mGestureDetector.onTouchEvent(event); } private class MyGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // 手指滑动时,根据滑动距离计算平移量 mTranslateX -= distanceX; mTranslateY -= distanceY; // 重新绘制SurfaceView invalidate(); return true; } @Override public boolean onDoubleTap(MotionEvent e) { // 双击时,将缩放比例设为1.0 mScaleFactor = 1.0f; // 重新绘制SurfaceView invalidate(); return true; } @Override public boolean onScale(ScaleGestureDetector detector) { // 缩放时,根据缩放因子计算缩放比例 mScaleFactor *= detector.getScaleFactor(); // 限制缩放比例的范围 mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f)); // 重新绘制SurfaceView invalidate(); return true; } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 设置缩放平移变换 canvas.scale(mScaleFactor, mScaleFactor); canvas.translate(mTranslateX, mTranslateY); // 绘制内容 // ... } } ``` 希望能对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值