如何将对象动画设置为跨各种屏幕尺寸的动画

时间:2014-06-15 19:08:11

标签: java android animation

所以我有这个动画,我一直在努力。基本上,当您单击图像时,它所做的只是将图像设置为新的Y坐标。 注意:请记住,我的图像都适合mdli,hdpi,xhdpi等缩放。 所以我有两个问题: 1 。当我在图像视图上使用.setY时,y坐标在其他手机上的加载方式不同。的 2 即可。当我同时使用我的图像和txt动画方法时,它们都会根据不同的手机/屏幕设置不同的y坐标。 所以我的问题是如何解决这两个问题,以便它们在所有屏幕尺寸上保持一致?

public class MainActivity extends Activity {

    final String tag = "My activity";

    ImageView mWhatsTheAnswerImg, mInspireMeImg, mHelpMeThink, mTalkToVince;


    ObjectAnimator mImageAnimation, mTxtAnimation;



    TextView mWhatsTheAnswerText, mInspireMeTxt, mHelpMeThinkTxt, mTalkToVinceTxt;
    boolean mWhatsTheAnswerBOOL,  mInspireMeBOOL, mHelpMeThinkBOOL, mTalkToVinceBOOL =false;


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



        ActionBar actionBar = getActionBar();
        actionBar.hide();



        mInspireMeImg = (ImageView) findViewById(R.id.inspireme);

        mInspireMeImg.setY(750);

        mInspireMeTxt = (TextView) findViewById(R.id.inspireMeTxt);

        mInspireMeTxt.setY(750);


        mInspireMeImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (mInspireMeBOOL) {



                    imageAnimate(mInspireMeImg, 750);
                    txtAnimate(mInspireMeTxt, 750);

                    Log.w(tag, "DOWN Coordinates: " + mInspireMeImg.getY() + "Txt: " + mInspireMeTxt.getY());





                    mInspireMeBOOL = false;
                } else {



                    mInspireMeBOOL = true;



                    imageAnimate(mInspireMeImg, +290);
                    txtAnimate(mInspireMeTxt, +290);

                    Log.w(tag, "UP Coordinates: " + mInspireMeImg.getY() + "Txt: " + mInspireMeTxt.getY());



                }

            }
        });

图片动画和txt动画方法:

private void imageAnimate(ImageView img, float YCoordinates){

     mImageAnimation =ObjectAnimator.ofFloat(img, View.TRANSLATION_Y,YCoordinates);

        Log.w(tag, "IMG Coordinates: " + img.getY());

        mImageAnimation.setDuration(1000);

        mImageAnimation.start();

    }


    private void txtAnimate(TextView txt, float YCoordinates){


        mTxtAnimation = ObjectAnimator.ofFloat(txt, View.TRANSLATION_Y, YCoordinates);

        Log.w(tag, "TXT Coordinates: " + txt.getY());


        mTxtAnimation.setDuration(1000);

        mTxtAnimation.start();
    }



}

编辑:XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="com.wyatt.avinceandroid.app.MainActivity">


    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/Background"
        android:src="@drawable/coachvincebackground"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:scaleType="fitXY"/>

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="1000dp"
        android:id="@+id/inspireme"
        android:src="@drawable/inspiremescreen"
        android:scaleType="fitXY"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/inspireMeTxt"
        android:layout_alignTop="@+id/helpMeThink"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="89dp" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="1000dp"
        android:id="@+id/helpMeThink"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="71dp"
        android:src="@drawable/helpmethinkscreen"
        android:scaleType="fitXY"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/helpMeThinkTxt"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="1000dp"
        android:id="@+id/whatsTheAnswer"
        android:src="@drawable/whatstheanswerscreen"
        android:scaleType="fitXY"
      />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/whatsTheAnswerTxt"
        android:layout_alignTop="@+id/AskVince"
        android:layout_alignLeft="@+id/inspireMeTxt"
        android:layout_alignStart="@+id/inspireMeTxt" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="1000dp"
        android:id="@+id/AskVince"
        android:src="@drawable/askvincescreen"
        android:scaleType="fitXY"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/askVinceTxt"
        android:layout_below="@+id/helpMeThinkTxt"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

1 个答案:

答案 0 :(得分:0)

setY和其他类似方法需要以像素为单位的值。现在,这正是问题所在。不同的手机具有不同分辨率的屏幕,因此第750个像素将位于不同手机上的不同位置,除非两个显示器相同。

解决方案很简单。使用DP中的值:

mInspireMeImg.setY(dpToPx(750));

并将此方法保存在某处:

public static int dpToPx(float dpValue, Context context){
    return (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, context.getResources().getDisplayMetrics());
}

有关DP单位的更多信息:

http://developer.android.com/training/multiscreen/screendensities.html

What is the difference between "px", "dp", "dip" and "sp" on Android?