마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

view의 위치 고정 도움 요청드립니다.

0 추천

안녕하세요 어제 비슷한 질문 올렸는데 질문이 정확치 않았어서 다시 한번 도움 요청드립니다.

하기의 그림과 같이 imageview의 background를 실제 사이즈보다 훨씬 큰 이미지를 사용하였습니다.

그리고 스크롤을 통해 폰의 화면이 위의 그림과 같이 움직이게 하였으며, 이후에 addview를 통해 ondraw를 하였습니다.

그런데 문제는 폰의 화면을 움직이면 ondraw한 그림들이 같이 움직이게 되더라고요.... 이동하면 안보이거나 해야하는데..

위의 그림의 addview 부분처럼... 저 부분이 왼쪽 그림의 addview 위치에 남겨두고 폰의 현재 화면만 우측 그림처럼

이동하고 싶은데 잘 되지가 않습니다. 도움 요청드립니다.

아래는 소스 입니다.

 


public class DrawTest extends Activity implements OnTouchListener{

    RelativeLayout rl;

    
    private ScrollView vScroll;
    private HorizontalScrollView hScroll;

    private static int xPos = 0, yPos = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        
        rl = (RelativeLayout)findViewById(R.id.rlay);
        
        DrawingView ov = new DrawingView(this);
        rl.addView(ov);
        
        
        init();
        EventSetting();


    }

    
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        View layoutMainView = (View)this.findViewById(R.id.rlay);
        
    }

    private void init() {
        vScroll = (ScrollView) findViewById(R.id.v_scroll);
        hScroll = (HorizontalScrollView) findViewById(R.id.h_scroll);

        vScroll.setFadingEdgeLength(0);
        hScroll.setFadingEdgeLength(0);

        vScroll.setOnTouchListener(this);
        hScroll.setOnTouchListener(this);
    }

    private void EventSetting() {
        vScroll.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                TouchMethod(v, event);
                return true;
            }
        });

        hScroll.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                TouchMethod(v, event);
                return true;
            }
        });
    }

    private void scroll(int x, int y) {
        hScroll.scrollBy(x, 0);
        vScroll.scrollBy(0, y);
    }

    public boolean TouchMethod(View v, MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xPos = (int) event.getRawX();
                yPos = (int) event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                int Xpos2 = (int) event.getRawX();
                int Ypos2 = (int) event.getRawY();
                scroll(xPos - Xpos2, yPos - Ypos2);
                xPos = Xpos2;
                yPos = Ypos2;
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                xPos = (int) event.getRawX();
                yPos = (int) event.getRawY();
                break;
        }
        xPos = (int) event.getRawX();
        yPos = (int) event.getRawY();
        return false;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        return false;
    }

}
public class DrawingView extends View{

    Drawable mDrawable = null;
    
    public DrawingView(Context context) {
        super(context);
        mDrawable = context.getResources().getDrawable(R.drawable.ic_launcher);
    }
    
    public DrawingView(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
    }

    public DrawingView(Context context, AttributeSet attrs){
        super(context, attrs);
    }
   


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        
        mDrawable.setBounds(50, 0, 300, 50);
        mDrawable.draw(canvas);
        
        Paint paint1 = new Paint();
        paint1.setColor(Color.BLUE);
        paint1.setAntiAlias(true);
        
        Paint paint2 = new Paint();
        paint2.setColor(Color.RED);
        paint2.setTextSize(20);
        paint2.setAntiAlias(true);
        
        Paint paint3 = new Paint();
        paint3.setColor(Color.GREEN);
        paint3.setStrokeWidth(2);
        paint3.setAntiAlias(true);
        
        Paint paint4 = new Paint();
        paint4.setColor(Color.YELLOW);
        paint4.setAntiAlias(true);

        Paint paint5 = new Paint();
        paint5.setColor(Color.GRAY);
        paint5.setTextSize(15);
        paint5.setAntiAlias(true);
        
        Paint paint6 = new Paint();
        paint6.setColor(Color.CYAN);
        paint6.setAntiAlias(true);
        
        Paint paint7 = new Paint();
        paint7.setColor(Color.MAGENTA);
        paint7.setStrokeWidth(1);
        paint7.setAntiAlias(true);
        
        Paint paint8 = new Paint();
        paint8.setColor(Color.BLACK);
        paint8.setTextSize(10);
        paint8.setAntiAlias(true);

        
        //원
        canvas.drawCircle(240, 250, 70, paint1);//(x,y,radius,paint)
        //글씨
        canvas.drawText("판매자", 300, 300, paint2);//(text,start x, start y)
        //선
        canvas.drawLine(240, 130, 240, 180, paint3);//(시작점x, 시작점y, 끝나느점x, 끝나는점y, paint)
        
        canvas.drawCircle(410, 250, 50, paint4);//오른쪽원
        canvas.drawLine(310, 250, 360, 250, paint3);//오른쪽선
        canvas.drawCircle(240, 80, 50, paint4);//윗쪽원
        canvas.drawLine(240, 320, 240, 370, paint3);//아래쪽선
        canvas.drawCircle(240, 420, 50, paint4);//아랫쪽원
        canvas.drawLine(120, 250, 170, 250, paint3);//왼쪽선
        canvas.drawCircle(70, 250, 50, paint4);//왼쪽원
        canvas.drawText("11", 245, 145, paint5);//위쪽선 옆 글짜
        canvas.drawText("22", 450, 300, paint5);//오른쪽 글짜
        canvas.drawText("33", 110, 300, paint5);//왼쪽 글짜
        canvas.drawText("44", 290, 440, paint5);//아래 글짜
        
        
        
        //구매자
        canvas.drawLine(410, 170, 410, 200, paint7);//top
        canvas.drawLine(460, 250, 490, 250, paint7);//right
        canvas.drawLine(410, 300, 410, 330, paint7);//bottom
        canvas.drawCircle(410, 140, 30, paint6);//위쪽원
        canvas.drawCircle(520, 250, 30, paint6);//오른쪽원
        canvas.drawCircle(410, 360, 30, paint6);//아랫쪽원
        canvas.drawText("1", 415, 180, paint8);//위쪽글짜
        canvas.drawText("2", 545, 275, paint8);//오른쪽글짜
        canvas.drawText("3", 415, 400, paint8);//아랫쪽글짜
        
    }
    
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rlay"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

	<ScrollView 
	    android:id="@+id/v_scroll"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:scrollbars="none" >
	    <HorizontalScrollView
	        android:id="@+id/h_scroll"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:scrollbars="none" >
	        <ImageView
	            android:id="@+id/image"
	            android:layout_width="1500dp"
	            android:layout_height="1500dp"
	            android:background="@drawable/test5" />
	    </HorizontalScrollView>
	
	</ScrollView>
</RelativeLayout>

 

wind (2,240 포인트) 님이 2013년 3월 14일 질문

1개의 답변

0 추천
소스만 봐서는 위에 그림처럼 움직일거같은데요 ;; 무슨 문제가 있나요.

 

혹시 안에있는 뷰까지 같이 스크롤 되도록 원하시면 parent뷰를 relativelayout이 아니라 HorizontalScrollview로 해야할거에요.
dev_아마 (9,750 포인트) 님이 2013년 3월 14일 답변
우선 답변 감사합니다.
제가 원하는 건 위의 2개의 그림중 오른쪽 처럼 되는 걸 원하는게 아니라
addview한 영역은 그냥 왼쪽 그림의 위치에 남아있는 걸 하려고 노력하고 있습니다.
...