저는 속도계를 구현하려고합니다. 분당 순찰에 대한 정보를 얻고 있고, 블루투스를 통해 엔진을 부스트하고로드하며 화면 마녀 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();
}
회전 코드를 별도의 스레드 또는 UI 스레드에서 실행하고 있습니까? – waqaslam
은 별도의 스레드 여야합니다. – 5w4rley
하지만 둘 다 시도하고 아무것도 변경하지 마십시오 – 5w4rley