17

子ビューを ViewPager の中心として設定する必要があります。また、次のビューと前のビューの一部を現在のビュー側に表示したいと思います(現在の画面 1 のように)。しかし、現在、現在のビューは ViewPager の左側から開始されています (2 以下の予想される画面のように)。どうすればそれを達成できますか?

これが私のコードです..

MyViewPagerAdapter

public class MyViewPagerAdapter extends PagerAdapter {
    private Activity mActivity;
    private int mPageCount;
    public MyViewPagerAdapter(Activity activity,int pageCount) {
        mActivity = activity;
        mPageCount = pageCount;
    }

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

    @Override
    public boolean isViewFromObject(View view, Object obj) {
        return (view ==(View)obj);
    }

    @Override
    public Object instantiateItem(ViewGroup container,final int position) {
        ViewGroup viewGroup = (ViewGroup)mActivity.getLayoutInflater().inflate(
                R.layout.item_view, null);

        viewGroup.setBackgroundColor(randomColor());

        TextView textView = (TextView)viewGroup.findViewById(R.id.textView1);
        textView.setText("Page: "+(position+1));
        Button button = (Button) viewGroup.findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(mActivity, "Hey, Its clicked!!! at page "+(position+1), Toast.LENGTH_LONG).show();
            }
        });
        container.addView(viewGroup);
        return viewGroup;
    }

    Random rnd = new Random();
    private int randomColor(){
        return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
    }

    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        //must be overridden else throws exception as not overridden.
        Log.d("Tag", collection.getChildCount()+"");
        collection.removeView((View) view);
    }

    @Override
    public float getPageWidth(int position) {
        return 0.8f;
    }
}

主な活動

public class MainActivity extends Activity {
    private ViewPager viewPager;
    LinearLayout linearLayout;
    private int ID = 100; 

    private final int count = 8;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = (ViewPager) findViewById(R.id.viewPager);
        linearLayout  = (LinearLayout) findViewById(R.id.indicator_layout);
        generateIndicators(count);


        MyViewPagerAdapter adapter = new MyViewPagerAdapter(this, count);
        viewPager.setAdapter(adapter);
        viewPager.setOnPageChangeListener(new OnPageChangeListener() {
            int oldPosition = 0;
            @Override
            public void onPageSelected(int position) {
                //this changes the old position's view state image
                ((TextView)linearLayout.getChildAt(oldPosition)).setText("");
                oldPosition = position;


                //this changes the current position's view state image
                ((TextView)linearLayout.getChildAt(position)).setText((position+1)+"");

            }
            //this method will be called repeatedly upto another item comes as front one(active one)
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {


            }
            //this will be called as per scroll state
            @Override
            public void onPageScrollStateChanged(int arg0) {


            }
        });

        viewPager.setOffscreenPageLimit(4);

    }

    private void generateIndicators(int count) {
        /// Converts 14 dip into its equivalent px
        int padd = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, getResources().getDisplayMetrics());

        for(int i=0;i<count;i++){
            TextView textView = new TextView(this);
            textView.setId(ID+i);
            final int currentItem = i;
            textView.setBackgroundResource(R.drawable.white_cell);
            textView.setPadding(padd,padd,padd,padd);
            /// Converts 14 dip into its equivalent px
            int size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
            textView.setTextSize(size);
            textView.setGravity(Gravity.CENTER);
            /// Converts 14 dip into its equivalent px
            int px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30, getResources().getDisplayMetrics());

            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(px, px);
            linearLayout.addView(textView,params);
        }

        ((TextView)linearLayout.getChildAt(0)).setText("1");

    }





}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >



   <android.support.v4.view.ViewPager
       android:id="@+id/viewPager"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_alignParentLeft="true"
       android:layout_alignParentTop="true" >
   </android.support.v4.view.ViewPager>


   <LinearLayout
       android:id="@+id/indicator_layout"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"
       android:layout_centerHorizontal="true"
       android:layout_marginBottom="19dp" >
   </LinearLayout>

</RelativeLayout>

item_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="match_parent"
    android:id="@+id/root_view"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="click me" />

</LinearLayout>

現在の画面 現在の画面

予想される画面 予想される画面

4

7 に答える 7

12

あるアプリでは、次のように standard を使用して同様に実装しましたViewPager

  • 内部レイアウトに実際のコンテンツを表示して、ページを全画面表示にします。たとえば、フルスクリーン レイアウトRelativeLayoutを透明な背景で作成し、実際のコンテンツRelativeLayoutを親の中央に配置します。私の記憶が正しければ、その理由は、内部レイアウトだけをページとして使用すると、ViewPagerGalaxy Nexus などの一部のデバイスですべての画面幅を使用できなかったからです。

  • 負のページ マージン、つまり表示する次/前のページの量を設定するために使用ViewPager.setPageMargin()します。親フルスクリーン レイアウトの透明な領域のみに重なるようにしてください。

  • 呼び出しViewPager.setOffscreenPageLimit()て、オフスクリーン ページ数を2デフォルト以上に調整し1、実際にオフスクリーン ページを作成してスムーズなページングを確保します。そうしないと、すでに部分的に画面に表示されているにもかかわらず、次/前のページが描画されていることがわかります。

于 2013-05-02T18:58:11.577 に答える
10

OP が彼の質問を解決策で更新しなかったことに腹を立てている人のために、XML でこれを実行する方法を最小限の労力で説明するリンクを次に示します: http://blog.neteril.org/blog/2013/10/ 14/android-tip-viewpager-with-protruding-children/

基本的に、ビューページャーを XML で宣言するときは、左右のパディングを同じにし、android:clipToPadding="false" を設定します。(clipToPadding は、彼の xml サンプルに欠落しており、この効果を実現するために必要です)

于 2013-11-15T16:54:20.263 に答える
6

最後に、この質問に対するソリューションを GitHub に追加しました。回避策を得るために、いくつかのかなりのトリックを行いました。以下のリンクからプロジェクトを取得できます (実際には、説明をブログで作成する予定でしたが、それほど時間がありません)。

ここにリンクがあります(https://github.com/noundla/Sunny_Projects/tree/master/CenterLockViewPager

com.noundla.centerviewpagersample.compsファイルをパッケージからプロジェクトにコピーする必要があります。そして、クラスでその Viewpager の使用法を見ることができますMainActivity

誰かがこれに問題がある場合はお知らせください。

于 2013-11-16T17:01:51.937 に答える
0

ページ幅が異なるビューページャーで現在のページを中央に配置する必要があったため、パディングを使用したソリューションは適切ではありませんでした。また、ユーザーのスクロールも無効になりました (別のビュー ページャーによってスクロールされるタブ バー ビュー ページャーでした)。これを行うための非常に簡単なソリューションを次に示します。このように ViewPager.ScrollTo メソッドをオーバーライドするだけです (C# コード、Xamarin):

public override void ScrollTo(int x, int y)
{
    x -= (int) (MeasuredWidth * (1 - Adapter.GetPageWidth(CurrentItem)) / 2);

    base.ScrollTo(x, y);
}

また、各フラグメントのページ幅を計算する場合は、それらを配列にキャッシュすることを忘れないでください。

于 2015-10-02T11:12:40.993 に答える