2012-02-02 18 views
5

मैं कुछ गतिशील रूप से खींचे गए दृश्यों के साथ और एंड्रॉइड ऐप बनाने की कोशिश कर रहा हूं। वर्तमान में, दृश्यों को आकर्षित करने वाली एकमात्र चीज दृश्य के बीच में एक सर्कल है।मेरे विचार क्यों खींचे नहीं जा रहे हैं?

विचार ग्रिड व्यू के अंदर हैं, लेकिन ऐसा लगता है कि यह उन्हें सही नहीं लग रहा है।

यही होता है जब मैं स्क्रीन में लोड हो रहा है:

enter image description here

नारंगी ब्लॉक ग्रिड का मानना ​​है कि ध्यान केंद्रित किया में दृश्य है।

हालांकि, अगर मैं मेरी उंगली (या माउस) का उपयोग दृश्य के साथ खींचें करने के लिए, इसे सही ढंग से चित्रित किया जाता है:

enter image description here

ऐसा क्यों है?

मैं इसे हर समय दूसरी छवि कैसे खींच सकता हूं।

public class ChooseTablePanel extends GamePanel { 
    TableAdapter adapter; 

    public ChooseTablePanel(Context context, GamePanel nextPanel, 
      GamePanel failurePanel) { 
     super(context, nextPanel, failurePanel); 
     initialize(); 
    } 

    public ChooseTablePanel(Context context, AttributeSet attrs, 
      GamePanel nextPanel, GamePanel failurePanel) { 
     super(context, attrs, nextPanel, failurePanel); 
     initialize(); 
    } 

    private void initialize() {  
     adapter = new TableAdapter(getContext()); 
     adapter.setTables(new int[] {5,4,3,2,1,6}); 

     GridView gridView = new GridView(getContext()); 
     gridView.setAdapter(adapter); 
     gridView.setNumColumns(adapter.getCount()/3); 

     this.addView(gridView); 
     this.invalidate(); 
    } 


    class TableAdapter extends BaseAdapter { 
     private Context context; 
     private TableView[] tables; 

     public TableAdapter(Context context) { 
      this.context = context; 
     } 

     public void setTables(int[] tables) { 
      this.tables = new TableView[tables.length]; 

      for(int i = 0; i < tables.length; i++){ 
       this.tables[i] = new TableView(tables[i], context); 
      } 
     } 

     public int getCount() { 
      return tables.length; 
     } 

     public Object getItem(int position) { 
      return tables[position]; 
     } 

     public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      TableView tableView; 
      if (convertView == null) { // if it's not recycled, initialize some attributes 
       tableView = new TableView(1, this.context); 
       tableView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
       tableView.setPadding(8, 8, 8, 8); 
      } else { 
       tableView = (TableView) convertView; 
      } 

      tableView.invalidate(); 
      return tableView; 
     } 
    } 

    class TableView extends View { 
     private int seats; 

     public TableView(int Seats, Context context) { 
      super(context); 
      this.seats = Seats; 

      if(seats < 1){ 
       throw new IllegalArgumentException("Number of seats must be greater than one."); 
      } 
     } 

     public int getSeats() { 
      return seats; 
     } 

     @Override 
     protected void onDraw(Canvas canvas){ 
      int tableWidth = canvas.getWidth()/2; 
      ShapeDrawable tableShape = new ShapeDrawable(new OvalShape());   
      tableShape.setBounds(canvas.getWidth()/2 - tableWidth/2, canvas.getHeight()/2 - tableWidth/2, canvas.getWidth()/2 + tableWidth/2, canvas.getHeight()/2 + tableWidth/2); 

      tableShape.draw(canvas); 
      canvas.drawText(seats + "", 0, 0, new Paint()); 
     } 


    } 

} 
+0

आप कॉल करने के लिए प्रयास कर सकते हैं 'notifyDataSetChanged()' अपने 'TableAdapter' पर बाद आप' setTables() 'कहा जाता है: उदाहरण के लिए, APIDemos से इस कोड स्निपेट देखते हैं? – Jave

उत्तर

1

: इसे बाहर कैनवास उत्पादन के आकार के साथ इस विधि के लिए ऐड प्रवेश साफ़ करने के लिए।

1

मुझे लगता है कि समस्या पैदा होती है क्योंकि onDraw() के पहले कॉल पर कैनवास शून्य चौड़ाई और ऊंचाई है:

यहाँ कोड मैं का उपयोग कर रहा है। इसके बजाय canvas.getWidth() और canvas.getHeight()this.getWidth() और this.getHeight() उपयोग करने का प्रयास का उपयोग करने का

@Override 
protected void onDraw(Canvas canvas) { 
    int tableWidth = canvas.getWidth()/2; 
    Log.i("onDraw", "w=" + canvas.getWidth() + ", h=" + canvas.getHeight()); 
    ShapeDrawable tableShape = new ShapeDrawable(new OvalShape()); 
    ... 
} 
+0

क्या a.ch. के अलावा उत्तर में उल्लिखित, आपको अपने 'टेबल व्यू' में 'Measure() 'को ओवरराइड करना चाहिए - जिसके बिना व्यू सिस्टम में आपके दृश्य के आयामों का सटीक माप नहीं होगा। – curioustechizen

+0

यह सही ऊंचाई और चौड़ाई प्राप्त कर रहा है: w = 320, h = 480 – Malfist

0

मुझे पागल कहें, लेकिन क्या होता है यदि आप ऑन ड्रा() के अंत में अमान्य() को कॉल करते हैं?

@Override protected void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.WHITE); 
     mDrawable.draw(canvas); 
     invalidate(); 
    } 
+0

अमान्य जोड़ना कोई प्रभाव नहीं पड़ा। – Malfist

संबंधित मुद्दे