将animatedView添加到现有布局

时间:2014-07-08 11:34:03

标签: android android-layout animation setcontentview

好的,这是我的完整代码:

    package com.example.theball;

import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Display;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

@SuppressLint("NewApi")
@SuppressWarnings("unused")
public class MainActivity extends Activity implements SensorEventListener {
    private SensorManager sensorManager;
    private Sensor accelerometer;
    private long lastUpdate;
    AnimatedView animatedView = null;
    ShapeDrawable mDrawable = new ShapeDrawable();
    public static int x;
    public static int y;
    public static final int width = 50;
    public static final int height = 50;
    public boolean firstDraw = true;
    private int screen_width;
    private int screen_height;
    private int sensorX;
    private Timer t;
    private int TimeCounter = 0;
    private TextView highscore_int;
    private int sensorY;

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        highscore_int = (TextView) findViewById(R.id.highscore_int);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        accelerometer = sensorManager
                .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        lastUpdate = System.currentTimeMillis();
        animatedView = new AnimatedView(this);
        setContentView(animatedView);
        t = new Timer();
        t.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                runOnUiThread(new Runnable() {
                    public void run() {
                        TimeCounter++;
                    }
                });
            }
        }, 0, 1000);
    }

    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this, accelerometer,
                SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            sensorY = (int) event.values[1];
            sensorX = (int) event.values[0];
            x -= sensorX * 3;
            y += sensorY * 3;
            if (x <= 0 || x >= screen_width || y <= 0 || y >= screen_height) {
                finish();
                Intent myIntent = new Intent(this, YouLost.class);
                startActivity(myIntent);
            }
        }
    }


    public class AnimatedView extends ImageView {

        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        static final int width = 50;
        static final int height = 50;

        @SuppressLint("NewApi")
        public AnimatedView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            display.getSize(size);
            screen_width = size.x;
            screen_height = size.y;
            mDrawable = new ShapeDrawable(new OvalShape());
            mDrawable.getPaint().setColor(0xffffAC23);
            mDrawable.setBounds(0, 0, screen_width, screen_height);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            mDrawable.setBounds(x, y, x + width, y + height);
            if (firstDraw) {
                x = screen_width / 2;
                y = screen_height / 2;
                firstDraw = false;
            }
            mDrawable.draw(canvas);
            invalidate();
        }
    }
}

我的问题是,我想使用activity_main布局并仍然拥有animatedView,我该怎么办?请不要说我的问题是我设置了setContentView的两倍,我知道我知道了!那是因为我想要一个球和一个布局。

其他人遇到我的问题:http://stackoverflow.com/questions/22580336/android-animatedview-taking-up-whole-activity-screen .

animatedView为自己创建一个空布局,如果我要删除"setContentView(animatedView)"我会有布局而不是我的球。

现在我有一个带球的空布局。

1 个答案:

答案 0 :(得分:0)

您能否发布activity_main的XML?

听起来您想要做的是将FrameLayout创建为活动布局中的顶级视图。这将允许您将子视图堆叠在一起。然后,在致电setContentView(R.layout.activity_main)后,您可以执行以下操作:

FrameLayout myRootLayout = (FrameLayout) findViewById(R.id.id_of_top_level_framelayout);
animatedView = new AnimatedView(this);
myRootLayout.addView(animatedView);

如果您想指定animatedView的z顺序,也可以使用addView(animatedView, index)

请澄清我是否误解了你的问题。