【问题标题】:Android Animations and functions need to move to activity?Android 动画和功能需要移动到activity吗?
【发布时间】:2014-11-17 20:20:57
【问题描述】:

我正在开发一款带有触摸动作、蓝牙和菜单的小游戏。目前实现的代码在我的自定义视图中。

例如存储游戏数据的类的向量、当前数据的向量以及稍后将有一些用于动画和计时器的线程。 然而,没有“能力”的图标,但我也会实现它们。 以后会有一个进程或蓝牙服务,它也会调用自定义视图类中的方法。

我认为这是一个糟糕的设计 - 所以我不知道如何将我的功能移动到例如保存自定义视图的活动以及如何让自定义视图和活动相互通信。 也许你们中的一些人对如何做有建议。

这是活动:

Gamecontroller_Activity:

public class Gamecontroller_Activity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("Enter Function","Enter onCreate Gamecontroler_Activity");
        setContentView(R.layout.activity_gamecontroller);
    }
}

activity_gamecontroller.xml:

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

    <com.example.calma.Gamecontroller_View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</RelativeLayout> 

还有大的自定义视图类(简称)Gamecontroller_View.java:

public class Gamecontroller_View  extends View implements OnGestureListener{
    

    //Touch
     private PointF fingerpointer;
     private int totalClickt;
     private static final int SIZE = 60;

     private Paint mPaint;
     
     //Text Flashes
     private Paint textPaint;
     private Paint textPaintAction;
     private String currentMsg;
     private boolean currentMsgShow;
     
     //Drawables (Pictures)
     private int monsterscale;
     private int monsterMinimumBorderX;
     private int monsterMinimumBorderY;
     private Bitmap bitmap1,bitmap2;
     private HashMap<String, Bitmap> hashmapMonsterStandartBitmap;
     
     Display Informations;
     private DisplayMetrics displayMetrics;
     private int xDisplayMaximum;
     private int yDisplayMaximum;
         
     //Monsters
     private Vector<Monster>  currentMonsters;
     private int monsterCountGlobal;
     
     //Player Stats
     private Player playerMe;
     
     //Enemy Player Stats
     private Player playerEnemy;
    
    public Gamecontroller_View(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
      }
    
    
    public void initView(){
        
        //display

        displayMetrics = new DisplayMetrics();
        ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics);
        
        float displayPixelFactor = displayMetrics.widthPixels/displayMetrics.densityDpi;
        xDisplayMaximum =  displayMetrics.widthPixels ;
        yDisplayMaximum =   displayMetrics.heightPixels - (3*getStatusBarSizes());


        Log.i("Display","displaywidthpixels/displayMetrics: "+xDisplayMaximum);
        //yDisplayMaximum 
        
        
        //Enemy Player
        playerEnemy = new Player();
        
        //Monsters
        monsterscale =10;
        monsterMinimumBorderX= Math.min(xDisplayMaximum,yDisplayMaximum)/monsterscale;
        monsterMinimumBorderY= Math.max(xDisplayMaximum,yDisplayMaximum)/monsterscale;
        hashmapMonsterStandartBitmap = new HashMap<String,Bitmap>();
        currentMonsters = new Vector<Monster>();
        monsterCountGlobal = 0;
        Log.i("display","Monsterscale: "+monsterscale + " minMonsterBorder: "+monsterMinimumBorderX);
        
        
        //init Touch detection and draw
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(Color.BLUE);
        mPaint.setMaskFilter(new BlurMaskFilter(15, Blur.OUTER));
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
       
       //init Text wich will be drawn 
        textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        textPaint.setTextSize(30);
        textPaintAction = new Paint(Paint.ANTI_ALIAS_FLAG);
        textPaintAction.setTextSize(60);
        
        currentMsg = "";
        currentMsgShow = false;
        
        
        //Futher init stuff
        initPlayerMe();
        initPlayerEnemy();
        enemySpawn();
        preloadImages();
        showDebug();
        
    }
    
    public void initPlayerMe(){
        //Player
        playerMe = new Player();
        playerMe.setlife(100);
        playerMe.setMoney(0);
        playerMe.setStrength(1);
    
    }
    
    public void initPlayerEnemy(){
        //Player
        playerEnemy = new Player();
        playerEnemy.setlife(100);
        playerEnemy.setMoney(0);
        playerEnemy.setStrength(1);
    }
    
    public Vector<Dimension> findPlaceForMonsters(int n){
        
        //First Collect allready existing Monster Coordinates
        Vector <Dimension> currentPlaces = new Vector<Dimension>();
        Vector <Dimension> newPlaces = new Vector<Dimension>();
        
        for(int i = 0; i< currentMonsters.size();i++){
            if (currentMonsters.elementAt(i) != null){
                currentPlaces.add(currentMonsters.elementAt(i).getDimension());
                
            }
        }
        
        for (int i=0; i < n ;i++){
        newPlaces.add(new Dimension(getRandomNumberBetween(0, xDisplayMaximum-monsterMinimumBorderX),
                                    getRandomNumberBetween(0, yDisplayMaximum-monsterMinimumBorderY)));
        Log.i("randomPlaces","Point xy: " + newPlaces.lastElement().getX()+ " "+newPlaces.lastElement().getY());

        }
        
        Log.i("findPlfaceForMonsters",this.monsterMinimumBorderX+" "+this.monsterMinimumBorderY);
        
        return newPlaces;
    }
    
    public void enemySpawn(){
        
        int tempCount =0;

        Vector<Dimension> newPlaces = findPlaceForMonsters(6);

        
        for(int i=0; i < 2;i++){
            currentMonsters.add(new MonsterMedium(monsterCountGlobal));
            currentMonsters.lastElement().setDimension(new Dimension(newPlaces.elementAt(tempCount).getX(),newPlaces.elementAt(tempCount).getY(),monsterMinimumBorderX,monsterMinimumBorderY));
            monsterCountGlobal++;
            tempCount++;
        }   
        
        for(int i=0; i < 2;i++){
            currentMonsters.add(new MonsterSmall(monsterCountGlobal));
            currentMonsters.lastElement().setDimension(new Dimension(newPlaces.elementAt(tempCount).getX(),newPlaces.elementAt(tempCount).getY(),monsterMinimumBorderX,monsterMinimumBorderY));
            monsterCountGlobal++;
            tempCount++;

        }   
        for(int i=0; i < 2;i++){
            currentMonsters.add(new MonsterHeavy(monsterCountGlobal));
            currentMonsters.lastElement().setDimension(new Dimension(newPlaces.elementAt(tempCount).getX(),newPlaces.elementAt(tempCount).getY(),monsterMinimumBorderX,monsterMinimumBorderY));
            monsterCountGlobal++;
            tempCount++;
        }   
            
            
        

    }
    
    public void attackMonster(int id){
        
        for (int i=currentMonsters.size()-1; i >= 0; i--){
            if (currentMonsters.elementAt(i).getID() == id){
            
                int restlife = currentMonsters.elementAt(i).setDamge(this.playerMe.getStrength());
                lifeOfMonsterChanged(currentMonsters.elementAt(i).getID(),i,restlife);
                break;
            }
        }
        
    }
    
    public void lifeOfMonsterChanged(int id,int index, int life){
        if (life <= 0){
            Log.i("MonsterTouchted", "Monster tot");
            currentMonsters.removeElementAt(index);
        }
        else{
            Log.i("MonsterTouchted", "Monster "+id+" restlife: "+life);
            //effekte? (shake?) farbE?
        }
    }
       
    
    @Override
      public boolean onTouchEvent(MotionEvent event) {

        // get pointer index from the event object
        int pointerIndex = event.getActionIndex();

        // get pointer ID
        int pointerId = event.getPointerId(pointerIndex);
        Log.i("touch","event.getPointerID(): "+pointerId);


        // get masked (not specific to a pointer) action
        int maskedAction = event.getActionMasked();

        switch (maskedAction) {

        //Detection of a finger touch
        case MotionEvent.ACTION_DOWN:
            totalClickt = totalClickt+1;
            //attackTheMonster(currentPlayer.attack()); 
            fingerpointer = new PointF();
            fingerpointer.x = event.getX(0);
            fingerpointer.y = event.getY(0);
            
            for (int i=currentMonsters.size()-1; i >= 0; i--){
                if(currentMonsters.elementAt(i).getDimension().contains((int)fingerpointer.x, (int)fingerpointer.y)){
                    Log.i("MonsterTouchted","MonsterTouched: index: "+i);
                    attackMonster(currentMonsters.elementAt(i).getID());
                    break;
                }
            }
    
        case MotionEvent.ACTION_POINTER_DOWN: 
            {
          // Optional more than one finger

          break;
        }
        
        case MotionEvent.ACTION_MOVE: 
        { // a pointer was moved
            if (fingerpointer != null) {
                fingerpointer.x = event.getX(0);
                fingerpointer.y = event.getY(0);
                }   
          break;
        }
        
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL: {
            fingerpointer = null;
        break;
        }
        }
        invalidate();

        return true;
      }



    
      @Override
      protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // draw all pointers
          if (fingerpointer != null){

          mPaint.setColor(colors[0]);
          canvas.drawCircle(fingerpointer.x, fingerpointer.y, SIZE, mPaint);
          }
        
        
        // draw mosnters

          
        for(int i=0; i < currentMonsters.size();i++){
            if( currentMonsters.elementAt(i) != null){
                                canvas.drawBitmap(hashmapMonsterStandartBitmap.get(currentMonsters.elementAt(i).getImagePath()), currentMonsters.elementAt(i).getDimension().getX(), currentMonsters.elementAt(i).getDimension().getY(), mPaint); //bitmap, abstand left, abstand top, paint
                
            } else{
                Log.i("Failure","Draw monster nullpointer bei index: "+i);
            }
        }
        
        //draw extra texts
        if(currentMsgShow){
        Log.i("onDraw","enter currenMsgShow");

            if(displayMetrics != null){
            int textsize =  (int) textPaintAction.measureText(currentMsg);
            int sidespacing = (displayMetrics.widthPixels - textsize)/2;
            canvas.drawText(currentMsg, sidespacing, displayMetrics.heightPixels/5 , textPaintAction);
            }
        }
        
        //Draw extratext
        canvas.drawText( "Total Clickt: " + totalClickt, 10, 40 , textPaint);
 }
}

项目:

【问题讨论】:

  • 您想在 Gamecontroller_Activity 中调用 Gamecontroller_View 方法吗?是你的问题吗?
  • @Rami 是的 - 如何在我的活动中调用它们。以及如何将数据也带到活动中。

标签: android design-patterns view bluetooth


【解决方案1】:

进行这些更改:

1) 在您的 activity_gamecontroller.xml 中:

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

    <com.example.calma.Gamecontroller_View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/myGameController"/>
</RelativeLayout>

2) 在您的 Gamecontroller_Activity 中:

public class Gamecontroller_Activity extends Activity {

    Gamecontroller_View mGameControllerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("Enter Function","Enter onCreate Gamecontroler_Activity");
        setContentView(R.layout.activity_gamecontroller);
        mGameControllerView = (Gamecontroller_View) findViewById(R.id.myGameController);
    }
}

3) 现在您可以从 Gamecontroller_Activity 中的任何方法调用例如 mGameControllerView.initPlayerMe();

这是一个例子:

 public class Gamecontroller_Activity extends Activity {

        Gamecontroller_View mGameControllerView;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.i("Enter Function","Enter onCreate Gamecontroler_Activity");
            setContentView(R.layout.activity_gamecontroller);
            mGameControllerView = (Gamecontroller_View) findViewById(R.id.myGameController);
            testMethod();
        }

        private void testMethod(){
            mGameControllerView.enemySpawn();
        } 
 }

【讨论】:

  • 谢谢拉米。另一方面,当我知道想从视图中调用活动的方法时?
  • 不客气! ---没有直接的方法可以做到这一点。也许你可以为此使用一个界面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
相关资源
最近更新 更多