2011-07-29 79 views
2

我正在製作一個比屏幕大得多的基於網格的遊戲,並且用戶將在其中滾動。我基本上在擴展相對佈局的自定義類中放置了一堆ImageViews。問題是,即使RelativeLayout.LayoutParams設置爲我想要的正確尺寸(1280 * 1280)。圖像擠在屏幕的兩側,不要超出屏幕。我有滾動邏輯的工作,當我滾動時,我可以看到它是一個矩形的一個屏幕大小的圖像。我怎樣才能讓圖像延伸過屏幕?使相對佈局的內容大於屏幕

延伸相對佈局類:

public class GameGrid extends RelativeLayout { 
    ImageView[][] subViews; 
    int rows=0, cols=0, cellsize=0; 
    int width, height; 

    //Dragging variables 
    float startX; 
    float startY; 
    float lastX; 
    float lastY; 
    boolean touching; 
    boolean dragging; 
    int clickedChild; 

    public GameGrid(Context context) { 
     super(context); 
     init(); 
    } 

    public GameGrid(Context context, int rws, int cls, int clsze) { 
     super(context); 
     rows=rws; 
     cols=cls; 
     cellsize=clsze; 
     init(); 
    } 

    public GameGrid(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public GameGrid(Context context, AttributeSet attrs, int defaultStyles) { 
     super(context, attrs, defaultStyles); 
     init(); 
    } 

    public void init() { 
     rows=10; 
     cols=10; 
     cellsize=128; 

     startX = 0; 
     startY = 0; 
     lastX=0; 
     lastY=0; 
     touching = false; 
     dragging = false; 
     clickedChild = -1; 

     subViews = new ImageView[cols][rows]; 

     setLayoutParams(new RelativeLayout.LayoutParams(cellsize*cols,cellsize*rows)); 

     width=this.getLayoutParams().width; 
     height=this.getLayoutParams().height; 

     this.setMinimumWidth(width); 
     this.setMinimumHeight(height); 

     Log.i("info","****************"); 
     Log.i("info","GameGrid Made."); 
     Log.i("info","width: "+width+"\nheight: "+height); 
     Log.i("info","****************"); 

     makeGrid(); 

     // this.setOnTouchListener() 
    } 

    public boolean getDragging(){ 
     return dragging; 
    } 

    public void makeGrid() { 
     for(int y=0;y<rows;y++){ 
      for(int x=0;x<cols;x++){ 
       ImageView temp = new ImageView(getContext()); 
       temp.setImageResource(R.drawable.water1); 
       temp.setScaleType(ImageView.ScaleType.FIT_XY); 

       RelativeLayout.LayoutParams temp2 = new RelativeLayout.LayoutParams(width/cols,height/rows); 

       if (x == 0 && y == 0){ //If this is the first view being made, set it relative to the parent. 
        temp2.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
        temp2.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
       } 
       else if (x == 0){ //If this is in the first column, set it below the one above. 
        temp2.addRule(RelativeLayout.ALIGN_LEFT,subViews[0][y-1].getId()); 
        temp2.addRule(RelativeLayout.BELOW,subViews[0][y-1].getId()); 
       } 
       else { //Align the bottom with first one of that row. 
        temp2.addRule(RelativeLayout.RIGHT_OF,subViews[x-1][y].getId()); 
        temp2.addRule(RelativeLayout.ALIGN_BOTTOM,subViews[0][y].getId()); 
       } 

       temp.setLayoutParams(temp2); 

       subViews[x][y]=temp; 
       subViews[x][y].setId(x+y*cols+1); 

       // Toast.makeText(getContext(), "" + v.getId(), Toast.LENGTH_SHORT).show(); 

       subViews[x][y].setOnTouchListener(new OnTouchListener() { 
        public boolean onTouch(View v,MotionEvent event) { 
         if (event.getAction() == MotionEvent.ACTION_DOWN) 
          clickedChild = v.getId(); 
         return false; 
        } 
       }); 
       addView(temp); 
      } 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) 
     { // when the user touches the screen 
      startX = event.getX(); 
      startY = event.getY(); 
      lastX = event.getX(); 
      lastY = event.getY(); 
      touching = true; 
      dragging = false; 
      return true; 
     } 
     else if (event.getAction() == MotionEvent.ACTION_MOVE) 
     { // when the user moves the touch 
      if (!dragging) 
       dragging = true; 
      int distX = (int)(event.getX()-lastX); 
      int distY = (int)(event.getY()-lastY); 
      this.scrollBy(-distX, -distY); 
      lastX = event.getX(); 
      lastY = event.getY(); 
      return true; 
     } 
     else if (event.getAction() == MotionEvent.ACTION_UP) 
     { // when the user lifts the touch 
      if (!dragging){ 
       if (clickedChild>0){ 
       Toast.makeText(getContext(), "getHeight()= " + getHeight(), Toast.LENGTH_SHORT).show(); 

       clickedChild = -1; 
       } 
      } 
      touching = false; 
      dragging = false; 
      return true; 
     } 
     else if (event.getAction() == MotionEvent.ACTION_CANCEL) 
     { // if something gets lost in translation 
      startX = 0; 
      startY = 0; 
      lastX=0; 
      lastY=0; 
      touching = false; 
      dragging = false; 
      return true; 
     } 
     return false; 
    } 


    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 
     int parentHeight = MeasureSpec.getSize(heightMeasureSpec); 
     this.setMeasuredDimension(parentWidth, parentHeight); 
    } 

的活動:

public class Attacktics2 extends Activity { 
/** Called when the activity is first created. */ 
    GameGrid grid; 

    int rows, cols, cellsize; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

     setContentView(R.layout.main); 
    } 

    public void start(View view) { 
     view.setVisibility(View.GONE); 
     grid = new GameGrid(this,10,10,128); 
     setContentView(grid); 
    } 
} 

回答

1

既然你已經在做管理所有的滾動繁重,我建議你自己實現你的整個佈局邏輯,而不依賴於RelativeLayout。除了ScrollView和Horizo​​ntalScrollView之外,股票佈局類將限制他們的子級在父級範圍內。反過來,這些將被限制在屏幕尺寸上。如果您自己處理佈局邏輯,則可以放置子視圖,以便它們延伸出屏幕。然後,它將一個視口形成一個更大的網格,並可以渲染在視口內可見的那些子視圖。

+0

我也在考慮這個。所以要自己處理佈局,我是否需要重寫onLayout和onMeasure? – Amax125

+1

是的,你需要的最小值是擴展ViewGroup並覆蓋onLayout和onMeasure。看看[AbsoluteLayout](http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/widget/AbsoluteLayout.java;h = 970cbe353a8c52ddd9332281dbadf8d1dc977d6c; hb = HEAD)爲一個漂亮的裸骨骼佈局視圖。只有當孩子與可見區域相交時,您纔會發現覆蓋drawChild並調用超級性能對性能有好處。此外,定義一個擴展ViewGroup.LayoutParams並定義每個子佈局數據的靜態嵌套類可能會很有用。 –

+1

這是它的工作,謝謝! – Amax125