2014-04-22 11 views
0

여러 개의 사용자 정의 뷰가있는 HorizontalScrollView가 있습니다. HorizontalScrollView에서 핀치 확대/축소 이벤트를 감지하고 ScaleFactor를 자식 뷰에 전달합니다. 부모가 제공 한 ScaleFactor에 따라 하위 뷰의 크기를 조정하려고합니다.뷰의 onDraw 메소드가 너무 많이 호출되었습니다.

저는 이렇게하고 있습니다.

자식보기에 두 가지 변수가 있습니다. localScaleFactor 및 먼저 부모로부터 parentScalefactor를 가져옵니다. 그런 다음 사용자 정의 뷰의 onDraw 메서드에서 뷰의 크기를 조정하고 싶습니다.

localScaleFactor * = parentScalefactor canvas.scale (localScaleFactor, localScaleFactor);

하지만 내 onDraw 함수가 여러 번 호출 할 때 동물원을 한 번 꼬집어도 localScaleFactor가 매우 빠르게 증가하고 있습니다.

부모 핀치 줌 리스너

 private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 
     @Override 
     public boolean onScale(ScaleGestureDetector detector) { 

       mScaleFactor *= detector.getScaleFactor(); 
      mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f)); 
//sending pinch zoom event to its child index 'start' to 'last' 
      for(int i=start;i<=last;i++) 
      { 
       LinearLayout ll=(LinearLayout)pp.getChildAt(i); 
       DrawView view=(DrawView)ll.findViewById(R.id.drawview); 
       view.mScaleFactor=mScaleFactor; //setting child scalefactor 
       view.invalidate(); 
      } 


      return true; 
     } 
    } 

아동 된 onDraw 볼 방법

 public float mScaleFactor = 1.f; //this will be set by parent viewgroup 

public float sf = 1.f; //local scalefactor 
    public float oldsf=1.f; 
    @Override 

    public void onDraw(Canvas canvas) { 


     sf=(mScaleFactor/oldsf); 
     width=sf*700; 
     paint.setColor(Color.GREEN); 
     canvas.save(); 

     canvas.scale(sf , 1); 

     Log.e("Ronak","DrawView "+sf); 
     paint.setStyle(Paint.Style.FILL); 
     paint.setColor(Color.BLUE); 
     canvas.drawRect(r, paint); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setColor(Color.BLACK); 
     canvas.drawRect(r, paint); 


     requestLayout(); 
     oldsf=mScaleFactor; 

     } 
+0

핀치를 어떻게 구현하고 있습니까? 핀치 동안 터치 이벤트가 지속적으로 전송되는 많은 시간. 즉, 코드가 두 손가락의 점에서 실제로 많은 핀치를 많이 감지하여 단일 핀치를 감지 할 수 있습니다. –

+0

@RazsApps 핀치 줌 코드를 추가했습니다. 내가 잘못하고 있는지 확인하십시오. 관련 코드 만 추가했습니다. 따라서 코드의 일부를 얻지 못하면 회신하십시오. – user3265443

+1

ScaleGestureDetector에서 직접 작업 한 적이 없으므로 정확한 답이 없습니다.하지만 제가 사용했던 다른 제스처와 계속해서 이벤트를 계속 보내고 있습니다. 다시 한 번 사용자가 손가락을 화면에 올려 놓고 약간의 움직임이있는 한. 또한 전체 운동의 합계로 보냈는데 이는 각 이벤트 간의 차이점을 추적해야 함을 의미합니다. 나는 당신이 비슷한 문제를 겪고 있다고 의심합니다. 따라서 총 꼬집음은 2.0의 요인이 될 수 있지만, 1.2, 1.5, 1.6, 1.9, 2.0과 같은 여러 이벤트가 나타날 수 있습니다. 실제 계수를 곱하면 11 배가됩니다. –

답변

0

나는 무엇을 지금 일이 무엇 ScaleGestureDetector 워드 프로세서 http://developer.android.com/reference/android/view/ScaleGestureDetector.html#getScaleFactor%28%29에서 찾고있다 getScaleFactor에() 호출을 반환한다는 것입니다 참조 우리가 이전에 주장한 바와 같이 합산이 아니라 주어진 시점에 대한 스케일 인자. 이 방법으로 보인 것은 이 단순히 mScaleFactor = detector.getScaleFactor();이어야한다는 것이 었습니다. 매 번 적용 할 때마다 매번 적용되는 비율 값은 개별 배율 인수 자체가 아닌 개별 배율 인수의 결과 일 것입니다. 이전 제안없이 이전 코드로 돌아가서 한 줄의 코드를 변경하면 제대로 작동해야합니다. 죄송합니다 이전에 잘못된 흔적. -Jackson