android 不用XML,怎样在代码里用animation同时实现图片的缩放和移动。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 不用XML,怎样在代码里用animation同时实现图片的缩放和移动。相关的知识,希望对你有一定的参考价值。

1.在Java Code定义动画

AlphaAnimation

渐变透明度动画效果

ScaleAnimation

渐变尺寸伸缩动画效果

TranslateAnimation

画面转换位置移动动画效果

RotateAnimation

画面转移旋转动画效果

//定义变量

private Animation myAnimation_Alpha;

private Animation myAnimation_Scale;

private Animation myAnimation_Translate;

private Animation myAnimation_Rotate;

myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);

//第一个参数fromAlpha为 动画开始时候透明度

//第二个参数toAlpha为 动画结束时候透明度

myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

//第一个参数fromX为动画起始时 X坐标上的伸缩尺寸

//第二个参数toX为动画结束时 X坐标上的伸缩尺寸

//第三个参数fromY为动画起始时Y坐标上的伸缩尺寸

//第四个参数toY为动画结束时Y坐标上的伸缩尺寸

//第五个参数pivotXType为动画在X轴相对于物件位置类型

//第六个参数pivotXValue为动画相对于物件的X坐标的开始位置

//第七个参数pivotXType为动画在Y轴相对于物件位置类型

//第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置

myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);

//第一个参数fromXDelta为动画起始时 X坐标上的移动位置

//第二个参数toXDelta为动画结束时 X坐标上的移动位置

//第三个参数fromYDelta为动画起始时Y坐标上的移动位置

//第四个参数toYDelta为动画结束时Y坐标上的移动位置

myAnimation_Rotate=new RotateAnimation(0.0f,350.0f,Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIV E_TO_SELF, 0.5f);

//第一个参数fromDegrees为动画起始时的旋转角度

//第二个参数toDegrees为动画旋转到的角度

//第三个参数pivotXType为动画在X轴相对于物件位置类型

//第四个参数pivotXValue为动画相对于物件的X坐标的开始位

//第五个参数pivotXType为动画在Y轴相对于物件位置类型

//第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置

2.3自定义动画

除了以上4类动画外,在代码中继承android.view.animation.Animation类来实现自定义效果。通过重写Animation的applyTransformation(float interpolatedTime, Transformation t)函数来实现自定义动画效果。

在绘制动画的过程中会反复的调用applyTransformation函数,每次调用参数interpolatedTime值都会变化,该参数从0渐 变为1,当该参数为1时表明动画结束。通过参数Transformation 来获取变换的矩阵(matrix),通过改变矩阵就可以实现各种复杂的效果。

自定义图片旋转效果动画代码。

class ViewAnimation extends Animation



int mCenterX;

int mCenterY;

Camera camera = new Camera();

public ViewAnimation()





@Override

public void initialize(int width, int height, int parentWidth,

int parentHeight)



super.initialize(width, height, parentWidth, parentHeight);

mCenterX = width/2;

mCenterY = height/2;

setDuration(2500);

setFillAfter(true);

// setRepeatCount(100);

setInterpolator(new LinearInterpolator());



@Override

protected void applyTransformation(float interpolatedTime,

Transformation t)



final Matrix matrix = t.getMatrix();

camera.save();

camera.translate(0.0f, 0.0f, (1300 - 1300.0f * interpolatedTime));

camera.rotateY(360 * interpolatedTime);

camera.getMatrix(matrix);

matrix.preTranslate(-mCenterX, -mCenterY);

matrix.postTranslate(mCenterX, mCenterY);

camera.restore();





camera.translate(0.0f, 0.0f, (1300 - 1300.0f * interpolatedTime))在第一次调用的时候interpolatedTime值为0,相当于把ImageView在Z轴后移1300像素, 然后逐步的往前移动到0,同时camera.rotateY(360 * interpolatedTime)函数又把ImageView沿Y轴翻转360度

2.4动画实现

在代码的一个activity中,将需要动画的控件与已定义的动画关联,开启动画

private Animation mAnimationXXX = null;//生明动画

ImageView mAnimImageX = null;//生明 ImageView控件(或者其它需要有动画的控件)

mAnimImageX = (ImageView) this.findViewById(R.id.anim_imageX);//取得图片资源

mAnimImageX.startAnimation(mAnimationXXX);//基于xml文件,开启动画

mAnimImageX.startAnimation(new ViewAnimation());//基于自定义控件,开启动画。

2.5图片旋转Demo

public class AnimationDemo extends Activity

/** Called when the activity is first created. */

ImageView mAnimImage;

private Animation mAnimationAlpha = null;

private Animation mAnimationScale = null;

private Animation mAnimationTranslate = null;

private Animation mAnimationRotate = null;

@Override

public void onCreate(Bundle savedInstanceState)

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mAnimImage = (ImageView) this.findViewById(R.id.anim_image1);

mAnimationAlpha = AnimationUtils.loadAnimation(this,R.anim.alpha_animation);

mAnimationScale = AnimationUtils.loadAnimation(this,R.anim.scale_animation);

mAnimationTranslate = AnimationUtils.loadAnimation(this,R.anim.translate_animation);

mAnimationRotate = AnimationUtils.loadAnimation(this,R.anim.rotate_animation);



public boolean onKeyUp(int keyCode, KeyEvent event)



switch ( keyCode )



case KeyEvent.KEYCODE_1:

mAnimImage.startAnimation(mAnimationAlpha);

break;

case KeyEvent.KEYCODE_2:

mAnimImage.startAnimation(mAnimationScale);

break;

case KeyEvent.KEYCODE_3:

mAnimImage.startAnimation(mAnimationTranslate);

break;

case KeyEvent.KEYCODE_4:

mAnimImage.startAnimation( mAnimationRotate);

break;

case KeyEvent.KEYCODE_5:

mAnimImage.startAnimation(new ViewAnimation());

break;



return true;



public boolean onKeyDown(int keyCode, KeyEvent event)



if ( keyCode == KeyEvent.KEYCODE_BACK)



this.finish();

return true;



return super.onKeyDown(keyCode, event);





3 Frame动画

Frame 动画是顺序播放事先做好的图片。可以在XML Resource定义,也可以使AnimationDrawable中的API定义。

3.1Frame动画实现

定义XML文件

<?xml version="1.0" encoding="utf-8"?>

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"

android:oneshot="false">

<item android:drawable="@drawable/a1" android:duration="500" />

<item android:drawable="@drawable/a2" android:duration="500" />

<item android:drawable="@drawable/a3" android:duration="500" />

<item android:drawable="@drawable/a4" android:duration="500" />

<item android:drawable="@drawable/a5" android:duration="500" />

<item android:drawable="@drawable/a6" android:duration="500" />

<item android:drawable="@drawable/a7" android:duration="500" />

<item android:drawable="@drawable/a8" android:duration="500" />

<item android:drawable="@drawable/a9" android:duration="500" />

<item android:drawable="@drawable/a10" android:duration="500" />

<item android:drawable="@drawable/a11" android:duration="500" />

<item android:drawable="@drawable/a12" android:duration="500" />

<item android:drawable="@drawable/a13" android:duration="500" />

<item android:drawable="@drawable/a14" android:duration="500" />

<item android:drawable="@drawable/a15" android:duration="500" />

</animation-list>

定义动画类

public class GameView extends View



private AnimationDrawable frameAnimation = null;

Context mContext = null;

public GameView(Context context)



super(context);

mContext = context;

ImageView img = new ImageView(mContext);

img.setBackgroundResource(R.anim.frameanimation);

frameAnimation = (AnimationDrawable) img.getBackground();

frameAnimation.setOneShot( false );

this.setBackgroundDrawable(frameAnimation);



public void onDraw(Canvas canvas)



super.onDraw(canvas);



public boolean onKeyUp(int keyCode, KeyEvent event)



switch ( keyCode )



case KeyEvent.KEYCODE_DPAD_UP:

frameAnimation.start();

break;



return true;





开启动画

public class Activity01 extends Activity



private GameView mGameView;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState)



super.onCreate(savedInstanceState);

mGameView = new GameView(this);

setContentView(mGameView);



public boolean onKeyUp(int keyCode, KeyEvent event)



if ( mGameView == null )



return false;



mGameView.onKeyUp(keyCode,event);

return true;



public boolean onKeyDown(int keyCode, KeyEvent event)



if ( mGameView == null )



return false;



if ( keyCode == KeyEvent.KEYCODE_BACK)



this.finish();

return true;



return super.onKeyDown(keyCode, event);



参考技术A .....楼上复制帝啊。。。
随便定义一个AnimationSet as吧(onCreate前,共用)
然后你自己选择是触发按钮还是开始时同时处理啥的~触发两个动画的处理
随便写了
suofang();
yidong();
下面定义下。。。。。。
private void suofang()
as= new AnimationSet(true);//定义一个新AnimationSet
ScaleAnimation sa = new ScaleAnimation(开始x坐标伸缩尺寸,开始y坐标伸缩尺寸,)
结束x坐标伸缩尺寸,结束y坐标伸缩尺寸,x轴的百分比,y轴的百分比)//全员float可,
前4个伸缩尺寸0.0伸缩到没有,1.0正常,大于1.0放大
sa.setDuration(动画的时间long型);
as.addAnimation(sa);
这个位置写需要动画的组件你自己定义的image1,button1什么的.startAnimation(as);

private void yidong()
as = new Animation(true);
TranslateAnimation ta = new TranslateAnimation(开始x坐标,开始y坐标,结束x坐标,结束y坐标);
ta.setDuration();
as.addAnimation(ta);
.startAnimation(as);//跟前面一样的地方就不写了。。。比较懒。。。
本回答被提问者采纳

怎样在android中实现播放MP4资源文件?代码可行简洁的,不用按钮控制,我就是想做一闪屏

Android的MediaPlayer包含了Audio和video的播放功能

关于MediaPlayer的使用方式: 


    如何获得MediaPlayer实例:
    可以使用直接new的方式:
    MediaPlayer mp = new MediaPlayer();
    也可以使用create的方式,如:
    MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了


    如何设置要播放的文件:

    MediaPlayer要播放的文件主要包括3个来源:
    a. 用户在应用中事先自带的resource资源
    例如:MediaPlayer.create(this, R.raw.test);
    b. 存储在SD卡或其他文件路径下的媒体文件
    例如:mp.setDataSource("/sdcard/test.mp3");
    c. 网络上的媒体文件
    例如:mp.setDataSource("mp3或者mp4的地址");


    MediaPlayer常用API

    MediaPlayer的setDataSource一共四个方法:
    setDataSource (String path) 
    setDataSource (FileDescriptor fd) 
    setDataSource (Context context, Uri uri) 
    setDataSource (FileDescriptor fd, long offset, long length)


    对播放器的主要控制方法:

    Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:

        1.prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。

        2. start()是真正启动文件播放的方法
        3.pause()和stop()比较简单,起到暂停和停止播放的作用

        4.seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
        5.release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。

        6.reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。


参考技术A 问题解决了么 我也想知道怎么实现 另外 请问 VideoView01 是在xml文件里面定义的么 参考技术B public class Activity01 extends Activity
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 创建VideoView对象 */
final VideoView videoView = (VideoView) findViewById(R.id.VideoView01);
/* 设置路径 */
videoView.setVideoPath("/sdcard/test.mp4");
/* 设置模式-播放进度条 */
videoView.setMediaController(new MediaController(Activity01.this));
videoView.requestFocus();
videoView.start();

追问


不行,放不出来,文件绝对没问题,MP4格式

08-02 05:02:02.071: E/MediaPlayer(4466): Error (1,-2147483648)

追答

名字加上.mp4试试吧。

追问

加上了,一样
而且是引用资源内部文件,不是sd卡内的

本回答被提问者采纳

以上是关于android 不用XML,怎样在代码里用animation同时实现图片的缩放和移动。的主要内容,如果未能解决你的问题,请参考以下文章

ANDROID_MARS学习笔记_S02_008_ANIMATION第二种使用方式:xml

Android Animated Vector Drawable 无法在 xml 中循环

Tween Animation----Rotate旋转动画

android中的动画之变化动画事例2

Flutter 动画使用

怎样在网页里用html代码做圆角背景框