2017-09-05 1 views
0

을 그리기 때문에 이렇게 많은 질문이 있다는 것을 알고 있지만 답변 중 아무 것도 효과가 없었습니다.안드로이드 : 사용자 정의보기는

나는 ScrollView (모두 프로그래밍 방식으로)에 넣으려고하는 사용자 정의 View이 있습니다. ScrollView 자체가 잘 작동하고, 필요한 위치이며, 수행해야 할 작업을 수행하고 TextView을 추가하여 테스트했을 때 여전히 예상했던대로 작동합니다.

그러나 사용자 정의 View을 만들면보기가 그려지지 않으며 아무 것도없는 것처럼 보입니다. draw(Canvas canvas) 메서드는 호출되지 않습니다 (차이점을 모르지만 여전히 작동하지 않음에도 불구하고 onDraw으로 시도 함).

나는 그림을 그리거나 다시 그리기를 원할 때마다 View.invalidate()이라는 생성자에서 setWillNotDraw(false)과 같은 것들을 시도했지만 아무것도 작동하지 않는 것으로 보입니다. 여기

은 관련 코드입니다 : 사용자 지정보기 만들기 및 추가 클래스

private class LevelSelectionView extends View { 
    private ArrayList<LevelButton> levelButtons; 

    public LevelSelectionView(Context context) { 
     super(context); 
     levelButtons = new ArrayList<LevelButton>(); 
     int x = 20; 
     int y = 20; 
     for(int i = 0; i < 20; i++) { 
      levelButtons.add(new LevelButton(x, y, 100, 100, 10, i + 1)); 
      levelButtons.get(i).unlock(); 
      x += 100 + 20; 
     } 

     setWillNotDraw(false); 
    } 

    public void draw(Canvas canvas) { 
     super.draw(canvas); 

     System.out.println("is being called"); //except it isn't 
     Paint paint = new Paint(); 
     paint.setAntiAlias(env.getCurrentSettings().getAntialias()); 

     for(LevelButton lb : levelButtons) 
      lb.drawObject(canvas, paint); 
    } 
} 

있는 ScrollView 초기화 된

sv = new ScrollView(env.getContext()); 
ScaledBounds sb = UsefulMethods.getScaledBounds(50, 200, BBEnvironment.WIDTH - 100, BBEnvironment.HEIGHT - 300); 

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(sb.getWidth(), sb.getHeight()); 
sv.setTranslationX(sb.getX()); 
sv.setTranslationY(sb.getY()); 
sv.setLayoutParams(params); 
sv.setScrollbarFadingEnabled(false); 
sv.setScrollBarSize(0); 
sv.setBackgroundColor(Color.argb(150, 0, 255, 0)); 

사용자 정의보기

LevelSelectionView lsView = new LevelSelectionView(sv.getContext()); 
lsView.setLayoutParams(new RelativeLayout.LayoutParams(sv.getLayoutParams().width, 1000)); 
lsView.setBackgroundColor(Color.argb(150, 0, 0, 255)); 
sv.addView(lsView); 

왜 그리기가 아니며 어떻게 그릴 수 있습니까?

+0

ScrollView에'view'를 어떻게 추가 했습니까? 변수를 페인트하기 위해 색상을 설정하려고 했습니까? 사용자 정의보기가 xml에서 개별적으로 작동합니까? – emiraslan

+0

@emiraslan은 코드를 자르는 것처럼 보입니다. 'View'는'sv.addView (lsView)'를 사용하여'ScrollView'에 추가됩니다. 참고 : 관련 코드가 추가되었습니다 – Ryan

+0

draw 대신 onDraw (Canvas)를 오버 라이딩해야합니다. CustomView를 만들고 추가하는 코드를 ScrollView에 추가 할 수 있습니까? – Eselfar

답변

0

그 같은 시도하고 작동합니다

public class LevelSelectionView extends View { 
    private final static String TAG = LevelSelectionView.class.getSimpleName(); 

    private final ArrayList<Button> mButtons; 
    private final Paint mPaint; 

    public LevelSelectionView(Context context) { 
     super(context); 
     mButtons = new ArrayList<Button>(); 
     int x = 20; 
     int y = 20; 

     mPaint = new Paint(); 
//  mPaint.setAntiAlias(env.getCurrentSettings().getAntialias()); 


     Button myButton; 

     for (int i = 0; i < 20; i++) { 
      myButton = new Button(context); 
      myButton.setLayoutParams(new ViewGroup.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT, 
        LinearLayout.LayoutParams.MATCH_PARENT)); 


      mButtons.add(myButton); 
//   mButtons.get(i).unlock(); 
//   x += 100 + 20; 
     } 

     setWillNotDraw(false); 
    } 

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

     for (Button lb : mButtons) 
      Log.d(TAG, "is being called"); //except it isn't 
//   lb.drawObject(canvas, mPaint); 
    } 
} 

을 나는 그것이 사용자 정의 클래스의로 LevelButton 무엇인지 모른다. 나는 FrameLayout이를 사용하여, 그와 같은 LevelSelectionView를 만들 수 있지만있는 ScrollView와 같은 생각입니다 :

FrameLayout container = (FrameLayout) findViewById(R.id.container); 

LevelSelectionView view = new LevelSelectionView(this); 
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 

container.addView(view); 

아마 문제가 LevelButton하거나를 만들 ENV에서 컨텍스트를 사용하여 당신이 (사용 상황에서 온다 ScrollView 및 사용자 정의 클래스를 작성하기위한 ScrollView의 컨텍스트). 모든 클래스가 내부 클래스이므로 env 개체가 무엇인지 모르기 때문에 코드가 명확하지 않습니다.

0

onMeasure을 올바르게 구현해야 스크롤보기가 그 크기가 얼마나되는지 알 수 있습니다.

관련 문제