2014-04-16 3 views
0

오늘 4 ImageViews 및 ListView 레이아웃을 만들고 ImageView 위치에 따라 목록보기 위치를 업데이트하려고합니다.Android에서 움직이는 요소로 레이아웃을 올바르게 업데이트하는 방법은 무엇입니까?

SS 내가 할 노력하고있어 무엇을 보여 :

enter image description here enter image description here

우리는 "회색 손잡이"풀 일단리스트 뷰 위치가 업데이트 될 때 볼 수 있듯이. 다 잘됐지만 핸들을 움직이는 동안 그래픽이 부드럽지는 않지만 말더듬이가납니다.

이렇게 사용하는 코드는 다음과 같습니다.

btn.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent me) { 
      if (me.getAction() == MotionEvent.ACTION_DOWN) { 
       status = START_DRAGGING; 
      } 
      if (me.getAction() == MotionEvent.ACTION_UP) { 
       status = STOP_DRAGGING; 
       Log.i("Drag", "Stopped Dragging"); 
      } else if (me.getAction() == MotionEvent.ACTION_MOVE) { 
       if (status == START_DRAGGING) { 
        System.out.println("Dragging"); 

        GestureImageView image1 = (GestureImageView) findViewById(R.id.image1); 
        GestureImageView image2 = (GestureImageView) findViewById(R.id.image2); 

        ImageView header = (ImageView) findViewById(R.id.imageHeader); 

        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
          RelativeLayout.LayoutParams.WRAP_CONTENT, 
          RelativeLayout.LayoutParams.WRAP_CONTENT); 

        lp.addRule(RelativeLayout.CENTER_HORIZONTAL); 
        margin1 = (int) me.getRawY() - 100; 
        if (margin1 < header.getHeight() - btn.getHeight()/3) 
         margin1 = header.getHeight() - btn.getHeight()/3; 
        else if (margin1 > layout.getHeight() - 1.5 
          * btn.getHeight() - btn3.getHeight()) 
         margin1 = (int) (layout.getHeight() - 1.5 
           * btn.getHeight() - btn3.getHeight()); 
        lp.topMargin = margin1; 
        btn.setLayoutParams(lp); 

        if (margin1 >= margin2 - 35) { 
         RelativeLayout.LayoutParams newlp = new RelativeLayout.LayoutParams(
           RelativeLayout.LayoutParams.WRAP_CONTENT, 
           RelativeLayout.LayoutParams.WRAP_CONTENT); 

         newlp.addRule(RelativeLayout.CENTER_HORIZONTAL); 
         margin2 = margin1 + 35; 
         newlp.topMargin = margin2; 
         btn2.setLayoutParams(newlp); 

         RelativeLayout.LayoutParams newlp2 = new RelativeLayout.LayoutParams(
           RelativeLayout.LayoutParams.WRAP_CONTENT, 
           RelativeLayout.LayoutParams.FILL_PARENT); 
         newlp2.addRule(RelativeLayout.ABOVE, btn2.getId()); 
         newlp2.addRule(RelativeLayout.BELOW, header.getId()); 
         newlp2.bottomMargin = -(15 + margin2); 
         image2.setLayoutParams(newlp2); 
         image2.setAdditionalY(image2.getHeight(), 
           margin2 - 85, image2.getScaledHeight() 
             - margin2 - 85); 
        } 

        RelativeLayout.LayoutParams lp3 = new RelativeLayout.LayoutParams(
          RelativeLayout.LayoutParams.WRAP_CONTENT, 
          RelativeLayout.LayoutParams.FILL_PARENT); 
        lp3.addRule(RelativeLayout.ABOVE, btn.getId()); 
        lp3.addRule(RelativeLayout.BELOW, header.getId()); 
        lp3.bottomMargin = -(15 + margin1); 
        image1.setLayoutParams(lp3); 
        image1.setAdditionalY(image1.getHeight(), margin1 - 50, 
          image1.getScaledHeight() - margin1 - 50); 
       } 
      } 
      return false; 
     } 
    }); 

"회색 손잡이"에 청취자를 추가하고 움직이는 동안 레이아웃 규칙을 업데이트하고 여백을 계산합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

나를 돕기 위해 미리 Thx.

편집 : 내가 추가하는 것을 잊었다하여 더듬 더 큰 목록보기에게 더 큰 내가이 위치를 변경하는 동안 모든보기를 다시 작성 목록보기에 의한 생각이.

EDIT2 : 로그를 추가하고 목록보기를 이동하는 동안 목록보기가 움직일 때마다 모든보기가 다시 작성됩니다. 이것을 막을 수있는 방법이 있습니까? 사용자가 이미지 이동을 멈 추면 다시 만들 수 있습니까?

답변

0

내 ListView에서 "getView"를 최적화하여 문제를 해결했습니다. 의 ListView에 문제가 모두 들어

:

  1. convertView 새로운보기
  2. 사용 ViewHolders
  3. 을 만들 그나마 존재하는 경우
  4. ,의 getView에서 서체를 만들 수없는 생성자를 호출 모든 서체를 만들 마십시오
  5. 데이터베이스의 데이터로 목록을 채우는 경우 새 뷰가 생성 될 때마다 DB를 호출하는 대신 모든 필요한 데이터를 유지할 클래스를 만듭니다.
관련 문제