2012-09-09 3 views
-1

나는이 질문이 다른 시간에 물어 봤지만 내 문제를 해결할 수 없다는 것을 알고있다!안드로이드 어떻게 사용자 정의보기를 다시 그리는

보기를 확장하여 내 자신의보기 (RadarView)를 만듭니다. 하지만 ID는 업데이트되지 않습니다! 나는 "invalidate()"및 "postInvalidate()"를 사용하여 시도했지만 작동하지 않습니다! 여기

는 RadarView의 코드입니다 :

`공용 클래스 RadarView보기 {

private HashMap<Integer, RadarData> allNodes; 
    private int myId; 
    private double distance=0.0; //in degree 
    private double meeterDistance =0.0; // in meeters 
    private Paint paint,node,nodeText; 

    public RadarView(Context context, HashMap<Integer,RadarData> allNodes, int myId){ 
     super(context); 
     this.allNodes = allNodes; 
     this.myId=myId; 
     paint = new Paint(); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setAntiAlias(true);   
     paint.setColor(Color.GREEN); 

     node = new Paint(); 
     node.setStyle(Paint.Style.FILL); 
     node.setAntiAlias(true);    
     node.setColor(Color.GREEN); 

     nodeText = new Paint(); 
     nodeText.setStyle(Paint.Style.STROKE); 
     nodeText.setAntiAlias(true);    
     nodeText.setColor(Color.BLACK); 
    } 

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

     //here we draw the radar 
     canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, canvas.getWidth()/8, paint); 
     canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, canvas.getWidth()/4, paint); 
     canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, canvas.getWidth()/2.7f, paint); 
     canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, canvas.getWidth()/2, paint); 
     canvas.drawLine(canvas.getWidth()/2, 0, canvas.getWidth()/2, canvas.getHeight(), paint); 
     canvas.drawLine(0, canvas.getHeight()/2, canvas.getWidth(), canvas.getHeight()/2, paint); 
     canvas.drawLine(canvas.getWidth() - canvas.getWidth()/4, canvas.getHeight()/10, canvas.getWidth() - canvas.getWidth()/4 +canvas.getWidth()/8, canvas.getHeight()/10, paint); 

     //then we add nodes in the view, if at least one exist 
     if(allNodes!=null){ 
      RadarData me = allNodes.get(myId); 
      RadarData moreDistant = me; 
      Set<Integer> set = allNodes.keySet(); 
      set.remove(myId); 
      for (Integer key : set){ 
       RadarData element = allNodes.get(key); 
       //calculate if it's the more distant, in that case variable "moreDistant" is updated 
       if(distance<calculateDistance(element,me)){ 
        distance=calculateDistance(element,me); 
        moreDistant=element; 
       } 
      } 
      for (Integer key : set){ 
       drawNode(canvas,allNodes.get(key), me); 
      } 
      canvas.drawText("Unit: "+approximateDistance()/4+"degree", canvas.getWidth() - canvas.getWidth()/4, canvas.getHeight()/11, paint); 
     } 
} 

    private double approximateDistance(){ 
     int aux=(int) (distance*100); 
     return aux/100; 
    } 
    private void drawNode(Canvas canvas,RadarData element, RadarData me) { 
     int radius=canvas.getWidth()/2; 
     double x=element.getLongitude()-me.getLongitude(); 
     double y=element.getLatitude() - me.getLatitude(); 
     int xInTheView=(int)(radius + x*radius/distance); 
     int yInTheView=(int)(canvas.getHeight()/2 -y*radius/distance); 

     canvas.drawCircle(xInTheView, yInTheView, radius/10, node); 
     canvas.drawText(""+element.getId(), xInTheView, yInTheView, nodeText); 
    } 

    private double calculateDistance(RadarData element, RadarData me) { 
     return Math.hypot(element.getLatitude()-me.getLatitude(), 
       element.getLongitude()-me.getLongitude()); 
    } 

} 내가 전화의 주요 활동에 `

를 확장 할 때 GPS 위치 변경 :

private void updateRadarView(Location location) { 
    if(location!=null){ 
     RadarData newState= new RadarData(myId, location.getLatitude(), location.getLongitude(), RadarData.RUNNING); 
     allNodes = connectionHandler.request(newState); 
     radarView = new RadarView(this,allNodes,myId); 
     setContentView(radarView); 
    } 

} 

위에서 알 수 있듯이, 나는 radarView와 그것을 업데이트하려면 setContentView를 사용하십시오. 그러나 좋은 해결책이라고 생각하지 않습니다. 어떤 생각?

답변

0

왜 당신은 당신의 RadarViewsetNodes(HashMap<Integer,RadarData> allNodes) 방법을 생성하지 않는 당신이 radarView의 데이터를 설정해야 할 때마다 호출 : 내가 radarView.setNodes(allNodes)을 의미 대신에 그것을마다 다시?

+0

감사합니다 .--) 이것은 좋은 생각입니다! – Alex