天天看點

android旋轉view,android-具有旋轉變換的ViewPager

我想建立ViewPager,它在滑動時圍繞其getWidth()和getHeight()軸旋轉.我嘗試過,但是所有這些轉換隻有在具有各種效果的垂直和水準情況下才可行.

有什麼方法或提示可以開發這種ViewPager嗎?

編輯-解釋哪種旋轉

軸-getWidth,getHeight應該是樞軸點,一旦我滑動它,它就會旋轉,對于下一頁,它應該從(0,getHeight)軸旋轉.

為簡化起見,請考慮以下簡單情況-

>有一個有四個部分的圓

>目前僅顯示1個部分,其餘3個在螢幕外

>從右向左滑動後,ViewPager應該從第1頁旋轉到第2頁.

>如果我從左向右滑動,ViewPager應該從第1頁旋轉到第4頁.

>每次退出頁面和進入頁面都應從該圓圈的中心旋轉.

>圓的中心位于第一頁的getWidth,getHeight.是以,對于下一頁,它将始終為0,getHeight作為軸;對于上一頁,将始終為getWidth,對于軸始終為0.

解決方法:

更新

據我所讀,您想要這樣的過渡.實作了一個ViewPager.PageTransformer,如下所示.

android旋轉view,android-具有旋轉變換的ViewPager

這是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