gpt4 book ai didi

android - 在 ViewPager android 的中心对齐 subview

转载 作者:可可西里 更新时间:2023-11-01 18:56:41 25 4
gpt4 key购买 nike

我需要将 subview 设置为 ViewPager 的中心,并且我想将下一个和上一个 View 的某些部分显示到当前 View 边(如 1 下面的当前屏幕)。但目前当前 View 是从 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;
}
}

主 Activity

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>

当前屏幕 Current screen

预期屏幕 expected screen

最佳答案

对于一个应用程序,我使用标准的 ViewPager 实现了类似的方式:

  • 在内部布局中使页面全屏显示实际内容。例如,将全屏布局设置为具有透明背景的 RelativeLayout,并将实际内容设置为另一个以父级为中心的 RelativeLayout。如果我没记错的话,原因是仅将内部布局作为页面,ViewPager 不会占据某些设备(例如 Galaxy Nexus)上的所有屏幕宽度。

  • 使用 ViewPager.setPageMargin() 设置负页边距,即您要显示的下一页/上一页的大小。确保它只与父级全屏布局的透明区域重叠。

  • 调用 ViewPager.setOffscreenPageLimit() 将离屏页面计数从默认的 1 调整为至少 2 到通过真正在屏幕外创建页面来确保顺利分页。否则,您会看到正在绘制的下一页/上一页已经部分显示在屏幕上。

关于android - 在 ViewPager android 的中心对齐 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16212591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com