2012-03-23 3 views
0

저는 속도계를 구현하려고합니다. 분당 순찰에 대한 정보를 얻고 있고, 블루투스를 통해 엔진을 부스트하고로드하며 화면 마녀 3 화살표 마녀를 오른쪽 방향으로 가리켜 야합니다. 나는 회전 애니메이션 evry 시간을 사용하여 데이터를 얻을 (10-100ms) 화살표를 설정합니다. 그러나 그것은 나의 ui를 극단적으로 천천히 만든다. 버튼 클릭으로 반응하려면 500ms. Doose 누군가가 더 잘 작동하도록하는 법을 알고 있습니까?이미지를 회전하면 ui가 느려집니다.

소스 코드 :

public void setTacho() 
{ 


//rotate Tachonadel 
Rpmcurrentdegree=Rpmcurrentdegree+Rpmdegree; 
Rpmdegree=((rpms-lastrpm)*RPMtoDegree); 

RpmAnim=new RotateAnimation((float)Rpmcurrentdegree, (float)Rpmdegree,  ivNadel.getWidth()/2, ivNadel.getHeight()/2); 
RpmAnim.setFillEnabled(true); 
RpmAnim.setFillAfter(true); 
ivNadel.setAnimation(RpmAnim); 
RpmAnim.start(); 


//rotate Boostbalken 
currentBoostDegree=currentBoostDegree+BoostDegree; 
BoostDegree=(boost-lastBoost)*BOOSTtoDegree; 

//rotate Loadbalken 
currentLoadDegree=currentLoadDegree+LoadDegree; 
LoadDegree=(load-lastLoad)*LOADtoDegree; 


BoostAnim=new RotateAnimation((float)-currentBoostDegree, (float)-BoostDegree,  ivBoost.getWidth()/2, ivBoost.getHeight()/2); 
BoostAnim.setFillEnabled(true); 
BoostAnim.setFillAfter(true); 
ivBoost.setAnimation(BoostAnim); 
BoostAnim.start(); 

LoadAnim=new RotateAnimation((float)currentLoadDegree, (float)LoadDegree,  ivLoad.getWidth()/2, ivLoad.getHeight()/2); 
LoadAnim.setFillEnabled(true); 
LoadAnim.setFillAfter(true); 
ivLoad.setAnimation(LoadAnim); 
LoadAnim.start(); 

} 

내가 값이 그들이 변화하는 동안에 만 작동하지만 그렇지 않은 경우 화살표 다시 제로 위치로 이동 한 후 변경 한 경우에만 회전을 만들려고

. 새로운 위치를 잡아야한다는 것을 이미지에 알리기 위해 setfillafter를 사용하지 않습니까?

코드 :

public void setTacho() 

{ 
//rotate Tachonadel 
Rpmcurrentdegree=Rpmcurrentdegree+Rpmdegree; 
Rpmdegree=((rpms-lastrpm)*RPMtoDegree); 


if(Rpmdegree!=0) 
{ 
RpmAnim=new RotateAnimation((float)Rpmcurrentdegree, (float)Rpmdegree,  ivNadel.getWidth()/2, ivNadel.getHeight()/2); 
RpmAnim.setFillEnabled(true); 
RpmAnim.setFillAfter(true); 
ivNadel.setAnimation(RpmAnim); 
RpmAnim.start(); 
} 

//rotate Boostbalken 
currentBoostDegree=currentBoostDegree+BoostDegree; 
BoostDegree=(boost-lastBoost)*BOOSTtoDegree; 
//rotate Loadbalken 
currentLoadDegree=currentLoadDegree+LoadDegree; 
LoadDegree=(load-lastLoad)*LOADtoDegree; 

if(BoostDegree!=0) 
{ 
BoostAnim=new RotateAnimation((float)-currentBoostDegree, (float)-BoostDegree,  ivBoost.getWidth()/2, ivBoost.getHeight()/2); 
BoostAnim.setFillEnabled(true); 
BoostAnim.setFillAfter(true); 
ivBoost.setAnimation(BoostAnim); 
BoostAnim.start(); 
} 




if(LoadDegree!=0) 
{ 
LoadAnim=new RotateAnimation((float)currentLoadDegree, (float)LoadDegree,  ivLoad.getWidth()/2, ivLoad.getHeight()/2); 
LoadAnim.setFillEnabled(true); 
LoadAnim.setFillAfter(true); 
ivLoad.setAnimation(LoadAnim); 
LoadAnim.start(); 
} 
} 

나는 그것을 얻지 않는다 = (

들으 4 도움

편집 : 콜백

에게 전화 블루투스 스레드의

부분

while (run) { 
       try { 

        bytes = mmInStream.read(buffer); 

        if (connection.btCallback != null) 
        { 
          connection.btCallback.getData(buffer,bytes); 
        } 

       } catch (IOException e) { 

        break; 
       } 

블루투스 스레드의 콜백 메도 : 당신을 위해 도움이된다면

//for example 
ivNadel.post(new Runnable() { 
    @Override 
    public void run() { 
     ivNadel.setAnimation(RpmAnim); 
    } 
}); 

참조 : 당신이 다음과 같이 당신의 ImageViews에 애니메이션을 설정할 수 있도록

public void getData(byte[] bytes, int len) 
     { 
      setTacho(); 
     } 
+0

회전 코드를 별도의 스레드 또는 UI 스레드에서 실행하고 있습니까? – waqaslam

+0

은 별도의 스레드 여야합니다. – 5w4rley

+0

하지만 둘 다 시도하고 아무것도 변경하지 마십시오 – 5w4rley

답변

0

는, 별도의 스레드에서 회전 코드를 실행

+0

빌어 먹을 도움이되지 않았습니다. 여전히 느림 = ( – 5w4rley

+0

당신은 간단한 프로젝트에 넣을 수 있습니다, 온라인 업로드 및 내놔 링크 ... – waqaslam

+0

글쎄, 마침내 그것을 만들었습니다. 나는 rotateanimations matrix.postrotate를 바꿨다. 지금은 더 잘 작동한다. – 5w4rley

관련 문제