2012-03-04 4 views
0

막대 그래프가 포함 된보기를 만들었습니다. 이제는 임의의 숫자 생성기를 사용하고 1 초에 한 번씩 새로 고침합니다. 막대 중 하나를 클릭하면 선 그래프로 변경됩니다. 이 뷰의 코드입니다 :이 활동을 시작 것OnClick에 응답하지 않는 사용자 지정 새로 고침보기

public class BarGraph extends View implements OnClickListener{ 

private Paint paint; 
private String[] horlabels; 
private String[] verlabels; 
private String title; 
private int[] values; 
Context co; 
private RectF[] rects; 

public BarGraph(Context context, String title, String[] hor, String[] var) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    if (title == null) 
     title = ""; 
    else 
     this.title = title; 
    if (hor == null) 
     this.horlabels = new String[0]; 
    else 
     this.horlabels = hor; 
    if (var == null) 
     this.verlabels = new String[0]; 
    else 
     this.verlabels = var; 
    paint = new Paint(); 
    co = context; 
} 

public void updateVals(int[] vals){ 
    values = vals; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    float border = 20; 
    float horstart = border; 
    float height = getHeight(); 
    float width = getWidth() - 1; 
    int max = 100; 
    int min = 0; 
    float diff = max - min; 
    float graphheight = height - (2 * border); 
    float graphwidth = width - (2 * border); 
    rects = new RectF[horlabels.length]; 
    this.setClickable(true); 
    paint.setTextAlign(Align.LEFT); 
    int vers = verlabels.length - 1; 
    for (int i = 0; i < verlabels.length; i++) { 
     paint.setColor(Color.DKGRAY); 
     float y = ((graphheight/vers) * i) + border; 
     canvas.drawLine(horstart, y, width - border, y, paint); 
     paint.setColor(Color.WHITE); 
     canvas.drawText(verlabels[verlabels.length - 1 - i], 0, y, paint); 
    } 
    int hors = horlabels.length; 
    for (int i = 0; i < horlabels.length + 1; i++) { 
     paint.setColor(Color.DKGRAY); 
     float x = ((graphwidth/hors) * i) + horstart; 
     canvas.drawLine(x, height - border, x, border, paint); 
     paint.setTextAlign(Align.CENTER); 
     if (i==horlabels.length-1) 
      paint.setTextAlign(Align.RIGHT); 
     if (i==0) 
      paint.setTextAlign(Align.LEFT); 
     paint.setColor(Color.WHITE); 
    } 

    for (int i = 0; i < horlabels.length; i++) 
    { 
     float x = ((graphwidth/hors) * i) + horstart; 
     canvas.drawText(horlabels[i], x + (graphwidth/(2*hors)), height - 4, paint); 
    } 

    paint.setTextAlign(Align.CENTER); 
    canvas.drawText(title , (graphwidth/2) + horstart, border - 4, paint); 

    if (max != min) { 
     paint.setColor(Color.LTGRAY); 
     float datalength = values.length; 
     float colwidth = (width - (2 * border))/datalength; 
     for (int i = 0; i < values.length; i++) { 
      float val = values[i] - min; 
      float rat = val/diff; 
      float h = graphheight * rat; 
      RectF r = new RectF((i * colwidth) + horstart, (border - h) + graphheight, ((i * colwidth) + horstart) + (colwidth - 1), height - (border - 1)); 
      rects[i] = r; 
      canvas.drawRect(r, paint);  
     } 
    } 
} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    int[] coords = new int[2]; 
    v.getLocationInWindow(coords); 
    Toast t = Toast.makeText(co, "KLIKNIETO", Toast.LENGTH_LONG); 
    t.show(); 
    for(RectF r : rects){ 
     if(r.contains(coords[1], coords[2])) 
     { 
      try { 
       this.finalize(); 
      } catch (Throwable e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
    return; 
} 

:

public class GraphTestActivity extends Activity{ 
/** Called when the activity is first created. */ 

public List<DataSet> sets; 
String[] verlabels; 
int[] vals; 
BarGraph graph; 
Thread t1; 
String[] hortable; 
// private Updater task; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    sets = new LinkedList<DataSet>(); 
    verlabels = new String[] {"0", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100"}; 
    DataSet set1 = new DataSet("set1"); 
    DataSet set2 = new DataSet("set2"); 
    DataSet set3 = new DataSet("set3"); 
    DataSet set4 = new DataSet("set4"); 
    DataSet set5 = new DataSet("set5"); 
    sets.add(set1); 
    sets.add(set2); 
    sets.add(set3); 
    sets.add(set4); 
    sets.add(set5); 
    hortable = new String[sets.size()]; 
    vals = new int[sets.size()]; 
    for(int i = 0; i < sets.size(); i++) 
    { 
     hortable[i] = sets.get(i).getName(); 
    } 
    graph = new BarGraph(this, "Diagram slupkowy", hortable, verlabels); 
    for(DataSet d : sets) 
    { 
     d.nextGen(); 
    } 
    graph.updateVals(vals); 
    setContentView(graph); 
    new Updater().execute(); 
} 

@Override 
protected void onStart() { 
    // TODO Auto-generated method stub 
    super.onStart(); 
    new BarRefresh().execute();  
} 

class Updater extends AsyncTask<Void, Void, Void>{ 
    @Override 
    protected Void doInBackground(Void... params) { 
     // doSomething(); 
     while(true){ 
      for(DataSet d : sets) 
      { 
       d.nextGen(); 
      } 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      if(isCancelled()){ 
       break; 
      } 
     } 
     return null; 
    } 
} 

class BarRefresh extends AsyncTask<Void, Void, Void>{ 
    @Override 
    protected Void doInBackground(Void... params) { 
     // doSomething(); 
     while(true){ 
      for(int i = 0; i < sets.size(); i++) 
      { 
       vals[i] = sets.get(i).getLast(); 
      } 
      graph.updateVals(vals); 
      graph.postInvalidate(); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      if(isCancelled()){ 
       break; 
      } 
     } 
     return null; 
    } 
} 

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    super.onBackPressed(); 
    try { 
     this.finish(); 
    } catch (Throwable e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

문제는, 그것은 터치 반응하지 않습니다. BarRefresh 작업에서 새로 고침을 설정하는 방식과 관련이 있습니까?

답변

0

BarGraph보기 클래스를 클릭하려는 경우, OnClickListener가 아닌 OnClickListener가 있어야합니다.

여기 (이

2

bargraph.setOnClickListener(new OnClickListener() { 
@Override 
public void onClick(View v) { 
    //do whatever 
}}); 

처럼 활동에서 무언가를하거나 생성자 내에서 그 코드 청크를 넣을 수 있습니다) (OnClickListener를 당신이

1가 구현을 제거하는 일이다. setOnClickListener()) 모든 BarGraph 클래스에서 가져옵니다.

+0

이제 작동합니다. 고마워. – hubert

관련 문제