2012-08-15 6 views
0

여러 위젯을 사용한 작업을 감안할 때 드래그 작업 중에 몇 가지 추가 시각적 피드백을 제공하고 싶습니다. 드래그 부분이 기본 그림자와 함께 작동합니다. 또한 각 위젯에서 onDrag를 처리 할 때마다 위젯 영역 외부에 비트 맵 표시기를 그려야합니다. 위젯의 영역을 그리는 방법을 알아 냈지만 (예상대로) 경계를 넘어선 모든 내용을 클립합니다.드래그하는 동안 위젯 영역 외부로 그려야합니다.

첫 번째 생각은 SurfaceView를 사용하는 것입니다. 나는 부모를 기반으로 하나 만들어야 할 것 같습니다. 초보자로서, 이것은 알아 내야 할 많은 작업입니다. 그래서 누군가 먼저이 접근법을 검증 할 수 있기를 바랍니다.

또 다른 생각은 부모 캔버스에 직접 그려 보는 것입니다 (캔버스를 얻는 방법을 알아낼 수 있다면). 나는 이것이 마커가 움직일 필요가있을 때 내가 그렸던 것을 "지워야"할 것 같은 결점이 있다고 생각한다. 과도한 재 드로잉을 유발할 수 있습니까?

다른 방법이 있습니까? 부모님의 캔버스처럼 SurfaceView에서 "지우기"문제가 발생합니까?

답변

0

당신이 그리려는 공간을 나타내는 부모를 찾을 때까지 getParent를 재귀 적으로 사용할 수 있다고 생각합니다. 사용하는 레이아웃에 매우 의존적이기 때문에 시도하지 않았습니다. 레이아웃을 변경하면 코드를 변경해야 할 수 있습니다.

대신 레이아웃의 최상위 레벨에서 FrameLayout을 선택하고 원하는 레이아웃을 그 레이아웃의 하위 레이어로 지정합니다. 두 번째 자녀는 투명한 배경을 가진 "빈"뷰를 넣습니다. FrameLayout은 모든 자식을 서로 위에 표시합니다. 그래서 내 "빈"뷰가 원하는 레이아웃 위에 표시됩니다. 예 :

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:MyApp="http://schemas.android.com/apk/res/com.example.mockup" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TableLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
    ... stuff for my desired layout ... 
    </TableLayout> 

    <com.example.mockup.ActivityView 
    android:id="@+id/activity_view" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@null" /> 

</FrameLayout> 

코드는 위치 계산식을 제외하면 매우 힘이 빠릅니다. 레이아웃에 독립적이기 위해서는 모든 것을 화면 좌표로 변환하는 것이 가장 좋습니다. 그렇지 않으면 getTop(), getLeft()는 직접 부모를 기준으로 한 값을 반환합니다.이 값은 드로잉을 시작하는 위젯에서 수행 한 것과 같습니다.

private ActivityView mActivityView ; 

@Override 
public void onCreate (Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    // get "activity" view - this covers the whole activity space 
    mActivityView = (ActivityView)findViewById (R.id.activity_view); 

    // find the widget and give it the activity view 
    MyWidget widget = (MyWidget)findViewById (R.id.my_widget); 
    widget.setActivityView (mActivityView); 
} 

그리고 당신은 위젯이 필요합니다 - 도면 시작하는 하나 : 첫째, 당신이 당신의 활동이 필요

public void setActivityView (ActivityView v) 
{ 
    mActivityView = v; 
} 

public void drawThing (float touchX, float touchY) 
// touchX, touchY - location where user is touching, relative to "this" widget. 
{ 
    int[] locScreen = new int[2]; // x,y 
    getLocationOnScreen (locScreen); 
    int xScreen = locScreen[0] + touchX; 
    int yScreen = locScreen[1] + touchY; 
    mActivityView.drawThing (xScreen, yScreen); 
} 

마지막을, 당신은을 수행해야합니다 ActivityView에서 그리기

private int mXThing; 
private int mYThing; 

@Override 
protected void onDraw (Canvas canvas) 
{ 
    super.onDraw (canvas); 
    ... draw the "thing" using mXThing, mYThing ... 
} 

void drawThing (int xScreen, int yScreen) 
{ 
    // convert to view coords. 
    int[] loc = new int[2]; // x,y 
    getLocationOnScreen (loc); 
    mXThing = xScreen - loc[0]; 
    mYThing = yScreen - loc[1]; 
    invalidate(); 
} 

나는 다른 방법으로 이보다 더 좋은 방법이 있다고 상상해보십시오. 누구든지 제안 사항이 있으시면 언제든지 말씀해주십시오.

관련 문제