Programming

Google Maps API v2가 포함 된 ViewPager : 신비한 블랙 뷰

procodes 2020. 8. 26. 19:31
반응형

Google Maps API v2가 포함 된 ViewPager : 신비한 블랙 뷰


새로운 Google지도 API v2 조각을 뷰 페이저에 통합했습니다. 지도 조각에서 스크롤하면 검은 색보기가 인접한 조각과 겹칩니다. 누군가 해결 했습니까?

편집 : 스크린 샷

여기에 이미지 설명 입력

public static class PagerAdapter extends FragmentPagerAdapter{

    public PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    @Override
    public Fragment getItem(int position) {

        Fragment pageFragment;

        switch (position) {
        case 0:
            pageFragment = new TabAFragment();
            break;

        case 1:
            pageFragment = new TabBFragment();
            break;

        case 2:
            pageFragment = SupportMapFragment.newInstance();
            break;

        default:
            pageFragment = null;
            break;
        }

        return pageFragment;
    }
}

ViewPager내부 a 위에 투명한 배경이있는 다른 뷰를 배치하여 전환 후 검은 색 표면이 남겨지는 것을 막을 수있었습니다 FrameLayout.

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.ViewPager
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </android.support.v4.view.ViewPager>

    <!-- hack to fix ugly black artefact with maps v2 -->
    <FrameLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:background="@android:color/transparent" />

</FrameLayout>

SlidingMenu 및 ViewPager에서 동일한 문제가 발생했습니다. 지도 조각의 컨트롤 버튼이 왼쪽 아티팩트에서 검은 색이 아니라는 것을 알았습니다. onCreateView()방법을 재정 의하여 문제를 해결했습니다.MapFragment (SupportMapFragment)

@Override
public View onCreateView(LayoutInflater inflater, 
                         ViewGroup view, 
                         Bundle savedInstance) {

    View layout = super.onCreateView(inflater, view, savedInstance);
    FrameLayout frameLayout = new FrameLayout(getActivity());
    frameLayout.setBackgroundColor(
        getResources().getColor(android.R.color.transparent));
    ((ViewGroup) layout).addView(frameLayout,
        new ViewGroup.LayoutParams(
            LayoutParams.FILL_PARENT, 
            LayoutParams.FILL_PARENT
        )
    );
    return layout;
}

Google은 이에 대한 수정 사항을 발표했지만 4.1 이상에만 해당됩니다 (새 버전의 PlayServices를 다운로드 할 필요가 없으며 서버 측 플래그를 사용함).

문제를 우회하기 위해 제가 사용하는 방법은 다음과 같습니다. 4.1 이상인 기기에서 CPU주기를 낭비하지 않도록합니다.

public class FixMapFragment extends SupportMapFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, 
                             ViewGroup container, 
                             Bundle savedInstanceState) {

        View view = super.onCreateView(inflater, container, savedInstanceState);

        // Fix for black background on devices < 4.1
        if (android.os.Build.VERSION.SDK_INT < 
            android.os.Build.VERSION_CODES.JELLY_BEAN) {
            setMapTransparent((ViewGroup) view);
        }
        return view;
    }

    private void setMapTransparent(ViewGroup group) {
        int childCount = group.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = group.getChildAt(i);
            if (child instanceof ViewGroup) {
                setMapTransparent((ViewGroup) child);
            } else if (child instanceof SurfaceView) {
                child.setBackgroundColor(0x00000000);
            }
        }
    }
}

내 해결 방법 : GoogleMap 의 새 스냅 샷 인터페이스를 사용 하고 페이지를 스크롤하는 동안지도의 스냅 샷을 표시합니다.

다음은 스냅 샷을 설정하는 코드입니다 (FragmentMap.java라고하는 맵과 동일한 조각에 있음).

public void setSnapshot(int visibility) {
    switch(visibility) {
    case View.GONE:
        if(mapFragment.getView().getVisibility() == View.VISIBLE) {
            getMap().snapshot(new SnapshotReadyCallback() {
                @Override
                public void onSnapshotReady(Bitmap arg0) {
                    iv.setImageBitmap(arg0);
                }
            });
            iv.setVisibility(View.VISIBLE);
            mapFragment.getView().setVisibility(View.GONE);
        }
        break;
    case View.VISIBLE:
        if(mapFragment.getView().getVisibility() == View.GONE) {
            mapFragment.getView().setVisibility(View.VISIBLE);
            iv.setVisibility(View.GONE);
        }
        break;
    }
}

여기서 "mapFragment"는 내 SupportedMapFragment이고 "iv"는 ImageView입니다 (match_parent로 만듭니다).

그리고 여기에서 스크롤을 제어합니다.

pager.setOnPageChangeListener(new OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            if(position == 0 && positionOffsetPixels > 0 || position == 1 && positionOffsetPixels > 0) {
                ((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.GONE);
            } else if(position == 1 && positionOffsetPixels == 0) {
                ((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.VISIBLE);
            }
        }
        @Override
        public void onPageScrollStateChanged(int arg0) {}
        @Override
        public void onPageSelected(int arg0) {}
    });

맵 (FragmentMap)이있는 조각이 위치 1에 있으므로 위치 0에서 1로, 위치 1에서 2 (첫 번째 if 절)로 스크롤을 제어해야합니다. "getRegisteredFragment ()"는 사용자 정의 FragmentPagerAdapter에있는 함수로, "registeredFragments"라는 SparseArray (Fragment)가 있습니다.

So, whenever you scroll to or from your map, you always see a snapshot of it. This works very well for me.


I had same issue of black screen on scrolling of list view, i was using map fragment with list view in same screen i have resolved this issue with use of the magical property in xml where i am talking list view just we have to put android:scrollingCache="false".my issue is fixed try this property to stop lagging and flickering in your maps.


You haven't given much detail so there is only so much I can suggest. I had a similar issue that the screen flickered between views in the pager. It turned out to be the mapView inflating when swapping between pages the first time.

To be clear I had 3 pages in my pager and my map was the last page.

To solve this I found that setting the number of off screen pages to 2 (this worked in the case above) that when my fragment started it loaded all the views at once.

See http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit (int)


There is one more solution to this problem. I am showing MapFragment within another fragment. The MapFragment is dynamically added into the a FrameLayout.

The solution is to use frameLayout.setVisibility(View.Visible) and frameLayout.setVisibility(View.Gone) on open and close events of sliding menu. It dosent require an extra view to be added. And the black area is completely gone.

getSlidingMenu().setOnOpenListener(
        new OnOpenListener() {
            @Override
            public void onOpen() {
                frameLayout.setVisibility(View.GONE);
            }
        });

getSlidingMenu().setOnClosedListener(
        new OnClosedListener() {

            @Override
            public void onClosed() {
                frameLayout.setVisibility(View.VISIBLE);
            }
        });

위의 방법 중 어느 것도 나를 위해 일하지 않았으며 다른 곳에서도 찾은 다른 방법도 없었습니다. 마지막으로 부분 솔루션을 선택했습니다. ViewPager의 onPageChangeListener를 통해 페이지 변경을 수신하고 페이지가 스크롤을 시작할 때지도를 숨기고 스크롤이 중지되면 다시 표시합니다. 스크롤 할 때 표시되는 흰색보기도 추가했습니다.


내 사용자 지정 맵 조각 을 프로젝트에 복사하기 만하면 됩니다 . 그리고 상단과 하단에 ScrollView가있는 검은 색 선이있는 경우 ScrollView android : fadingEdge = "none"

public class CustomMapFragment extends SupportMapFragment {
private OnActivityCreatedListener onActivityCreatedListener;

public CustomMapFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup view, Bundle savedInstance) {
    View layout = super.onCreateView(inflater, view, savedInstance);

    FrameLayout frameLayout = new FrameLayout(getActivity());
    frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent));
    ((ViewGroup) layout).addView(frameLayout,
            new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    return layout;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (getOnActivityCreatedListener() != null)
        getOnActivityCreatedListener().onCreated();
}

public OnActivityCreatedListener getOnActivityCreatedListener() {
    return onActivityCreatedListener;
}

public void setOnActivityCreatedListener(
        OnActivityCreatedListener onActivityCreatedListener) {
    this.onActivityCreatedListener = onActivityCreatedListener;
}

public interface OnActivityCreatedListener {
    void onCreated();
}

}

참고 URL : https://stackoverflow.com/questions/13837697/viewpager-with-google-maps-api-v2-mysterious-black-view

반응형