我想建立ViewPager,它在滑動時圍繞其getWidth()和getHeight()軸旋轉.我嘗試過,但是所有這些轉換隻有在具有各種效果的垂直和水準情況下才可行.
有什麼方法或提示可以開發這種ViewPager嗎?
編輯-解釋哪種旋轉
軸-getWidth,getHeight應該是樞軸點,一旦我滑動它,它就會旋轉,對于下一頁,它應該從(0,getHeight)軸旋轉.
為簡化起見,請考慮以下簡單情況-
>有一個有四個部分的圓
>目前僅顯示1個部分,其餘3個在螢幕外
>從右向左滑動後,ViewPager應該從第1頁旋轉到第2頁.
>如果我從左向右滑動,ViewPager應該從第1頁旋轉到第4頁.
>每次退出頁面和進入頁面都應從該圓圈的中心旋轉.
>圓的中心位于第一頁的getWidth,getHeight.是以,對于下一頁,它将始終為0,getHeight作為軸;對于上一頁,将始終為getWidth,對于軸始終為0.
解決方法:
更新
據我所讀,您想要這樣的過渡.實作了一個ViewPager.PageTransformer,如下所示.
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SdPVFbS9CXt92YuIXdn1Waus2YhR3cuk2Lc9CX6MHc0RHaiojIsJye.gif)
這是ViewPager.PageTransformer類:
public class RotationCircleTransformer implements ViewPager.PageTransformer {
public RotationCircleTransformer() {
}
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
int pageHeight = view.getHeight();
view.setPivotX((float) pageWidth);
view.setPivotY((float) pageHeight);
if (position < -1) { //[-infinity,1)
//off to the left by a lot
view.setRotation(0);
view.setAlpha(0);
} else if (position <= 1) { //[-1,1]
view.setTranslationX((-position) * pageWidth); //shift the view over
view.setRotation(position * (90)); //rotate it
// Fade the page relative to its distance from the center
view.setAlpha(Math.max(1, 1 - Math.abs(position) / 3));
} else { //(1, +infinity]
//off to the right by a lot
view.setRotation(0);
view.setAlpha(0);
}
}
}
background_quarter.xml:
android:shape="rectangle">
activity_circle_pager.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
android:id="@+id/pager"
android:layout_gravity="center"
android:layout_width="300dp"
android:layout_height="300dp" />
fragment_content.xml
android:layout_width="300dp"
android:layout_height="300dp"
android:id="@+id/bg"
android:background="@drawable/background_quarter">
android:id="@+id/text"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="40dp"
android:textColor="@android:color/white"
android:text="" />
CircleFragment.class
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
public class CircleFragment extends Fragment {
private String typeString;
public CircleFragment() {
}
public static CircleFragment newInstance(String type) {
CircleFragment fragment = new CircleFragment();
Bundle args = new Bundle();
args.putString("type", type);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
typeString = getArguments().getString("type","1");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_content, container, false);
;
TextView text = (TextView) view.findViewById(R.id.text);
FrameLayout bg = (FrameLayout) view.findViewById(R.id.bg);
switch (typeString) {
case "1":
bg.setBackgroundDrawable(ContextCompat.getDrawable(getContext(), R.drawable.background_quarter));
break;
case "2":
bg.setBackgroundDrawable(ContextCompat.getDrawable(getContext(), R.drawable.background_quarter));
break;
case "3":
bg.setBackgroundDrawable(ContextCompat.getDrawable(getContext(), R.drawable.background_quarter));
break;
case "4":
bg.setBackgroundDrawable(ContextCompat.getDrawable(getContext(), R.drawable.background_quarter));
break;
}
text.setText(typeString);
return view;
}
}
CirclePagerActivity.class
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
public class CirclePagerActivity extends AppCompatActivity {
ViewPager mPager;
CirclePagerAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_circle_pager);
mPager = (ViewPager) findViewById(R.id.pager);
List fragments = new ArrayList<>();
fragments.add(ContentFragment.newInstance("1"));
fragments.add(ContentFragment.newInstance("2"));
fragments.add(ContentFragment.newInstance("3"));
fragments.add(ContentFragment.newInstance("4"));
mAdapter = new CirclePagerAdapter(getSupportFragmentManager(), fragments);
mPager.setAdapter(mAdapter);
mPager.setPageTransformer(true, new RotationCircleTransformer());
}
@Override
protected void onDestroy() {
super.onDestroy();
}
static class CirclePagerAdapter extends FragmentStatePagerAdapter {
List mFrags = new ArrayList<>();
public CirclePagerAdapter(FragmentManager fm, List frags) {
super(fm);
mFrags = frags;
}
@Override
public Fragment getItem(int position) {
int index = position % mFrags.size();
return mFrags.get(index);
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
}
}
如果找不到合适的ViewPager轉換動畫,則可以實作自己的ViewPager.PageTransformer
There is提供了很多資訊和多個示例.
另外here還能找到有用的教程.
您能解釋一下這部分嗎?我會根據您的解釋更新我的答案(視覺效果更好).
rotates around it’s getWidth() and getHeight() axis.
标簽:android-viewpager,android-view,android
來源: https://codeday.me/bug/20191026/1933062.html