এমন কোনও উপায় তৈরি করার উপায় রয়েছে ViewPager
যা অনুভূমিকভাবে স্ক্রোল না করে তবে উল্লম্বভাবে ?!
এমন কোনও উপায় তৈরি করার উপায় রয়েছে ViewPager
যা অনুভূমিকভাবে স্ক্রোল না করে তবে উল্লম্বভাবে ?!
উত্তর:
উল্লম্বের মায়া দেওয়ার জন্য আপনি একটি ভিউপেজার.পেজ ট্রান্সফরমার ব্যবহার করতে পারেন ViewPager
। অনুভূমিক টানার পরিবর্তে উল্লম্ব সাথে স্ক্রোলিং অর্জন করতে আপনাকে ViewPager
ডিফল্ট স্পর্শ ইভেন্টগুলিকে ওভাররাইড করতে হবে এবং MotionEvent
এগুলি পরিচালনা করার আগে এর স্থানাঙ্কগুলি অদলবদল করতে হবে, যেমন:
/**
* Uses a combination of a PageTransformer and swapping X & Y coordinates
* of touch events to create the illusion of a vertically scrolling ViewPager.
*
* Requires API 11+
*
*/
public class VerticalViewPager extends ViewPager {
public VerticalViewPager(Context context) {
super(context);
init();
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
// The majority of the magic happens here
setPageTransformer(true, new VerticalPageTransformer());
// The easiest way to get rid of the overscroll drawing that happens on the left and right
setOverScrollMode(OVER_SCROLL_NEVER);
}
private class VerticalPageTransformer implements ViewPager.PageTransformer {
@Override
public void transformPage(View view, float position) {
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 1) { // [-1,1]
view.setAlpha(1);
// Counteract the default slide transition
view.setTranslationX(view.getWidth() * -position);
//set Y position to swipe in from top
float yPosition = position * view.getHeight();
view.setTranslationY(yPosition);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
/**
* Swaps the X and Y coordinates of your touch event.
*/
private MotionEvent swapXY(MotionEvent ev) {
float width = getWidth();
float height = getHeight();
float newX = (ev.getY() / height) * width;
float newY = (ev.getX() / width) * height;
ev.setLocation(newX, newY);
return ev;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev){
boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
swapXY(ev); // return touch coordinates to original reference frame for any child views
return intercepted;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(swapXY(ev));
}
}
আপনি যথাযথ দেখতে দেখতে এই সেটিংগুলি টুইট করতে পারেন। এই মত দেখতে শেষ:
এখানে অন্যান্য উত্তরগুলির সাথে তাদের কিছু সমস্যা রয়েছে বলে মনে হচ্ছে। এমনকি প্রস্তাবিত ওপেন সোর্স প্রকল্পগুলি বাগ বাগের সাথে সাম্প্রতিক পুলের অনুরোধগুলি মার্জ করে নি। তারপরে আমি VerticalViewPager
গুগলের কাছ থেকে একটি পেয়েছি যে তারা কিছু ডেস্কলক অ্যাপ্লিকেশন ব্যবহার করেছে। আমি এখানে আশেপাশে ভাসমান অন্যান্য উত্তরগুলির চেয়ে অনেক বেশি গুগলের প্রয়োগ বাস্তবায়িত বিশ্বাস করি। (গুগলের সংস্করণ বর্তমান শীর্ষ-ভোট দেওয়া উত্তরের মতো, তবে আরও পুঙ্খানুপুঙ্খ।)
এই উদাহরণটি ক্লাসটি ব্যবহারের জন্য কয়েকটি ছোট ছোট পরিবর্তন করে আমার বেসিক ভিউপেজার উদাহরণের মতো প্রায় একই VerticalViewPager
।
মূল ক্রিয়াকলাপের জন্য এবং প্রতিটি পৃষ্ঠার (টুকরা) জন্য এক্সএমএল লেআউট যুক্ত করুন। নোট করুন যে আমরা VerticalViewPager
মানের চেয়ে ব্যবহার করি ViewPager
। আমি নীচের জন্য কোড অন্তর্ভুক্ত করব।
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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="com.example.verticalviewpager.MainActivity">
<com.example.myapp.VerticalViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
fragment_one.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textview"
android:textSize="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</RelativeLayout>
এর কোডটি VerticalViewPager
আমার নয়। গুগল সোর্স কোড থেকে এটি কেবল একটি স্ট্রিপ ডাউন সংস্করণ (কোনও মন্তব্য ছাড়াই)। এটি সর্বাধিক টু ডেট সংস্করণে দেখুন Check সেখানে মন্তব্যগুলি কী ঘটছে তা বোঝার জন্য সহায়ক।
import android.support.v4.view.ViewPager;
public class VerticalViewPager extends ViewPager {
public VerticalViewPager(Context context) {
this(context, null);
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
@Override
public boolean canScrollHorizontally(int direction) {
return false;
}
@Override
public boolean canScrollVertically(int direction) {
return super.canScrollHorizontally(direction);
}
private void init() {
setPageTransformer(true, new VerticalPageTransformer());
setOverScrollMode(View.OVER_SCROLL_NEVER);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
final boolean toIntercept = super.onInterceptTouchEvent(flipXY(ev));
flipXY(ev);
return toIntercept;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
final boolean toHandle = super.onTouchEvent(flipXY(ev));
flipXY(ev);
return toHandle;
}
private MotionEvent flipXY(MotionEvent ev) {
final float width = getWidth();
final float height = getHeight();
final float x = (ev.getY() / height) * width;
final float y = (ev.getX() / width) * height;
ev.setLocation(x, y);
return ev;
}
private static final class VerticalPageTransformer implements ViewPager.PageTransformer {
@Override
public void transformPage(View view, float position) {
final int pageWidth = view.getWidth();
final int pageHeight = view.getHeight();
if (position < -1) {
view.setAlpha(0);
} else if (position <= 1) {
view.setAlpha(1);
view.setTranslationX(pageWidth * -position);
float yPosition = position * pageHeight;
view.setTranslationY(yPosition);
} else {
view.setAlpha(0);
}
}
}
}
MainActivity.java
আমি শুধু কোন মতেই বার VerticalViewPager
জন্য ViewPager
।
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
public class MainActivity extends AppCompatActivity {
static final int NUMBER_OF_PAGES = 2;
MyAdapter mAdapter;
VerticalViewPager mPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = findViewById(R.id.viewpager);
mPager.setAdapter(mAdapter);
}
public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUMBER_OF_PAGES;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return FragmentOne.newInstance(0, Color.WHITE);
case 1:
// return a different Fragment class here
// if you want want a completely different layout
return FragmentOne.newInstance(1, Color.CYAN);
default:
return null;
}
}
}
public static class FragmentOne extends Fragment {
private static final String MY_NUM_KEY = "num";
private static final String MY_COLOR_KEY = "color";
private int mNum;
private int mColor;
// You can modify the parameters to pass in whatever you want
static FragmentOne newInstance(int num, int color) {
FragmentOne f = new FragmentOne();
Bundle args = new Bundle();
args.putInt(MY_NUM_KEY, num);
args.putInt(MY_COLOR_KEY, color);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNum = getArguments() != null ? getArguments().getInt(MY_NUM_KEY) : 0;
mColor = getArguments() != null ? getArguments().getInt(MY_COLOR_KEY) : Color.BLACK;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_one, container, false);
v.setBackgroundColor(mColor);
TextView textView = v.findViewById(R.id.textview);
textView.setText("Page " + mNum);
return v;
}
}
}
আপনার অ্যাপটি চালাতে সক্ষম হবে এবং উপরের অ্যানিমেশনের ফলাফলটি দেখতে পাবে।
আমার একটি সমাধান রয়েছে যা আমার জন্য দুটি পদক্ষেপে কাজ করে।
onInstantiateItem()
এর মধ্যে PagerAdapter
, ভিউটি তৈরি করুন এবং এটি -90-এর মধ্যে ঘোরান:
view.setRotation(-90f)
আপনি যদি ব্যবহার করে থাকেন FragmentPagerAdapter
তবে:
objFragment.getView().setRotation(-90)
ViewPager
90 ডিগ্রি অনুসারে ঘোরান :
objViewPager.setRotation(90)
কমপক্ষে আমার প্রয়োজনীয়তার জন্য একটি কবজির মতো কাজ করে।
উল্লম্ব ভিউপ্যাজারটি অনুভূমিকের অভ্যন্তরে কীভাবে কাজ করতে হয় তার সাথে লড়াই করে যাচ্ছেন তার জন্য কেবল নিম্নলিখিত জিনিসগুলি করুন:
public class VerticalViewPager extends ViewPager {
public VerticalViewPager(Context context) {
super(context);
init();
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
setPageTransformer(true, new VerticalPageTransformer());
setOverScrollMode(OVER_SCROLL_NEVER);
}
private class VerticalPageTransformer implements ViewPager.PageTransformer {
@Override
public void transformPage(View view, float position) {
if (position < -1) {
view.setAlpha(0);
} else if (position <= 1) {
view.setAlpha(1);
view.setTranslationX(view.getWidth() * -position);
float yPosition = position * view.getHeight();
view.setTranslationY(yPosition);
} else {
view.setAlpha(0);
}
}
}
private MotionEvent swapXY(MotionEvent ev) {
float width = getWidth();
float height = getHeight();
float newX = (ev.getY() / height) * width;
float newY = (ev.getX() / width) * height;
ev.setLocation(newX, newY);
return ev;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
swapXY(ev);
return intercepted;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(swapXY(ev));
}
}
public class HorizontalViewPager extends ViewPager {
private GestureDetector xScrollDetector;
public HorizontalViewPager(Context context) {
super(context);
}
public HorizontalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
xScrollDetector = new GestureDetector(getContext(), new XScrollDetector());
}
class XScrollDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return Math.abs(distanceX) > Math.abs(distanceY);
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (xScrollDetector.onTouchEvent(ev)) {
super.onInterceptTouchEvent(ev);
return true;
}
return super.onInterceptTouchEvent(ev);
}
}
সামান্য বর্ধন এই উত্তরটি আমাকে আমার প্রয়োজনীয়তা অর্জন করতে সহায়তা করেছে (উল্লম্ব ভিউ পেজার ইনশোর্টগুলির মতো একইরকম অ্যানিমেট করতে - 60 শব্দে নিউজ )
public class VerticalViewPager extends ViewPager {
public VerticalViewPager(Context context) {
super(context);
init();
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
// The majority of the magic happens here
setPageTransformer(true, new VerticalPageTransformer());
// The easiest way to get rid of the overscroll drawing that happens on the left and right
setOverScrollMode(OVER_SCROLL_NEVER);
}
private class VerticalPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.75f;
@Override
public void transformPage(View view, float position) {
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 0) { // [-1,0]
// Use the default slide transition when moving to the left page
view.setAlpha(1);
// Counteract the default slide transition
view.setTranslationX(view.getWidth() * -position);
//set Y position to swipe in from top
float yPosition = position * view.getHeight();
view.setTranslationY(yPosition);
view.setScaleX(1);
view.setScaleY(1);
} else if (position <= 1) { // [0,1]
view.setAlpha(1);
// Counteract the default slide transition
view.setTranslationX(view.getWidth() * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE
+ (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
/**
* Swaps the X and Y coordinates of your touch event.
*/
private MotionEvent swapXY(MotionEvent ev) {
float width = getWidth();
float height = getHeight();
float newX = (ev.getY() / height) * width;
float newY = (ev.getX() / width) * height;
ev.setLocation(newX, newY);
return ev;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev){
boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
swapXY(ev); // return touch coordinates to original reference frame for any child views
return intercepted;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(swapXY(ev));
}
}
আমি আশা করি এটি অন্য কারও পক্ষে সহায়ক হতে পারে।
এখানে কয়েকটি মুক্ত উত্স প্রকল্প রয়েছে যা এটি করার দাবি করে to এখানে তারা:
এগুলি তাদের লেখক দ্বারা অবচয় হিসাবে চিহ্নিত করা হয়েছে:
এবং আরও একটি জিনিস:
deskclock
তবে এটি আনুষ্ঠানিকভাবে সমর্থিত বলে মনে হচ্ছে না কারণ আমি এটির জন্য নথিপত্র পাইনি।এটি দেখুন: https://github.com/JakeWharton/Android- দিকনির্দেশী ভিউপাগার
বা নীচের প্রশ্নটি আপনাকে সহায়তা করতে পারে: উল্লম্ব 'পৃষ্ঠাগুলির সাথে গ্রিডভিউ' বা 'ভিউপেজার'
DirectionalViewPager
কিছুক্ষণের জন্য আপডেট করা হয়নি এবং তাই ViewPager
সমর্থন লাইব্রেরিতে কিছু নতুন বৈশিষ্ট্য অনুপস্থিত ; অর্থাত setPageMargin(int)
। সাধারণত এটি কাজ করা উচিত যদিও। এবং যদি তা না হয় তবে উত্স কোডটি ধরে নেওয়া ViewPager
এবং সমস্ত এক্স / ওয়াই এবং প্রস্থ / উচ্চতার যুক্তি সরিয়ে আনা খুব জটিল নয় ।
DirectionalViewPager
তবে, যেমনটি এমএইচ বলেছে, এটি আপডেট করা হয়নি (এর বিকাশকারী এটি অগ্রাহ্য হিসাবে বিবেচনা করুন) !! এটি অবিশ্বাস্য যে অ্যান্ড্রয়েড বিকাশকারীরা সম্প্রদায়কে উল্লম্ব নয় ViewPager
, কেবল অনুভূমিক সরবরাহ করে। আমি অ্যান্ড্রয়েডে আরও নবীন, ViewPager
এক্স / ওয়াই আউট আমার উল্লম্বভাবে সোয়াপিংয়ের বিকাশ করা আমার পক্ষে এত সহজ নয় .. আমি ইতিমধ্যে নির্মিত সমাধানটি পছন্দ
ডিভাইস প্রদর্শনগুলি আয়তক্ষেত্রাকার হওয়ায় সঠিকভাবে স্থানাঙ্কগুলি (এক্স, ওয়াই) কে (ওয়াই, এক্স) রূপান্তর করতে @ ব্রেট এবং @ সালমান 666 এর উত্তরের কেবলমাত্র একটি উন্নতি :
...
/**
* Swaps the X and Y coordinates of your touch event
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(swapXY(ev));
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(swapXY(ev));
}
private MotionEvent swapXY(MotionEvent ev) {
//Get display dimensions
float displayWidth=this.getWidth();
float displayHeight=this.getHeight();
//Get current touch position
float posX=ev.getX();
float posY=ev.getY();
//Transform (X,Y) into (Y,X) taking display dimensions into account
float newPosX=(posY/displayHeight)*displayWidth;
float newPosY=(1-posX/displayWidth)*displayHeight;
//swap the x and y coords of the touch event
ev.setLocation(newPosX, newPosY);
return ev;
}
...
যাইহোক, টাচস্ক্রিন প্রতিক্রিয়াশীলতা আরও ভাল করার জন্য এখনও কিছু করা দরকার। @ সালমান 666 এর উত্তরে @msdark যে মন্তব্য করেছে তাতে এই সমস্যাটি সম্পর্কিত হতে পারে।
true
হয়েছে onInterceptTouchEvent
এবং আমি কী বাইন্ডিংগুলিকে সংশোধন করেছি, যাতে একটি ডিপিএড ব্যবহার করে এটি বাম / ডান পরিবর্তে ইউপি / ডাউন এর সাথে স্ক্রোলকে ট্রিগার করে: gist.github.com/zevektor/fbacf4f6c39fd6e409
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class VerticalViewPager extends ViewPager {
public VerticalViewPager(Context context) {
super(context);
init();
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
setPageTransformer(true, new VerticalPageTransformer());
setOverScrollMode(OVER_SCROLL_NEVER);
}
private class VerticalPageTransformer implements PageTransformer {
@Override
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
int pageHeight = view.getHeight();
if (position < -1) {
view.setAlpha(0);
} else if (position <= 1) {
view.setAlpha(1);
view.setTranslationX(pageWidth * -position);
float yPosition = position * pageHeight;
view.setTranslationY(yPosition);
} else {
view.setAlpha(0);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
ev.setLocation(ev.getY(), ev.getX());
return super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
ev.setLocation(ev.getY(), ev.getX());
return super.onInterceptTouchEvent(ev);
}
}
অ্যান্ড্রয়েড উত্সটিতে ইতিমধ্যে একটি রয়েছে । আমি আরও ভাল কাজ করার জন্য এটি পরিবর্তন করেছি:
package com.crnlgcs.sdk.widgets;
import android.content.Context;
import android.support.v4.view.ViewConfigurationCompat;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewParent;
public class VerticalViewPager extends ViewPager {
private static final String TAG = "VerticalViewPager";
private static final boolean DEBUG = true;
private float mLastMotionX;
private float mLastMotionY;
private float mTouchSlop;
private boolean mVerticalDrag;
private boolean mHorizontalDrag;
// Vertical transit page transformer
private final ViewPager.PageTransformer mPageTransformer = new ViewPager.PageTransformer() {
@Override
public void transformPage(View view, float position) {
final int pageWidth = view.getWidth();
final int pageHeight = view.getHeight();
if (position < -1) {
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 1) {
view.setAlpha(1);
// Counteract the default slide transition
view.setTranslationX(pageWidth * -position);
// set Y position to swipe in from top
float yPosition = position * pageHeight;
view.setTranslationY(yPosition);
} else {
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
};
public VerticalViewPager(Context context) {
super(context, null);
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
final ViewConfiguration configuration = ViewConfiguration.get(context);
mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration);
init();
}
private void init() {
// Make page transit vertical
setPageTransformer(true, mPageTransformer);
// Get rid of the overscroll drawing that happens on the left and right (the ripple)
setOverScrollMode(View.OVER_SCROLL_NEVER);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
final float x = ev.getX();
final float y = ev.getY();
if (DEBUG) Log.v(TAG, "onTouchEvent " + x + ", " + y);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN: {
mLastMotionX = x;
mLastMotionY = y;
if (!super.onTouchEvent(ev))
return false;
return verticalDrag(ev);
}
case MotionEvent.ACTION_MOVE: {
final float xDiff = Math.abs(x - mLastMotionX);
final float yDiff = Math.abs(y - mLastMotionY);
if (!mHorizontalDrag && !mVerticalDrag) {
if (xDiff > mTouchSlop && xDiff > yDiff) { // Swiping left and right
mHorizontalDrag = true;
} else if (yDiff > mTouchSlop && yDiff > xDiff) { //Swiping up and down
mVerticalDrag = true;
}
}
if (mHorizontalDrag) {
return super.onTouchEvent(ev);
} else if (mVerticalDrag) {
return verticalDrag(ev);
}
}
case MotionEvent.ACTION_UP: {
if (mHorizontalDrag) {
mHorizontalDrag = false;
return super.onTouchEvent(ev);
}
if (mVerticalDrag) {
mVerticalDrag = false;
return verticalDrag(ev);
}
}
}
// Set both flags to false in case user lifted finger in the parent view pager
mHorizontalDrag = false;
mVerticalDrag = false;
return false;
}
private boolean verticalDrag(MotionEvent ev) {
final float x = ev.getX();
final float y = ev.getY();
ev.setLocation(y, x);
return super.onTouchEvent(ev);
}
}
বর্তমানে আরও সক্রিয় একটি সংগ্রহস্থল হ'ল lsjwzh / RecyclerViewPager ।
RecyclerView
এটি একটি উল্লম্ব স্ক্রোলযোগ্য ভিউপ্যাজার বাস্তবায়ন Rec রিসাইক্লারভিউ এবং তালিকাভিউয়ের সাথে ভাল কাজ করে। গুচং / উল্লম্ব ভিউপ্যাজার ।
ভিউপ্যাজারটি উল্লম্বভাবে স্ক্রোল তৈরি করতে ভিউপ্যাজ.আর.পেজট্রান্সফর্মার ব্যবহার করুন এবং স্ক্রোলের বিরোধের সাথে মোকাবিলা করার জন্য একটি ভিউও অন টচলিস্টনার সরবরাহ করুন।
/**
* 1.dispatch ACTION_DOWN,ACTION_UP,ACTION_CANCEL to child<br>
* 2.hack ACTION_MOVE
*
* @param v
* @param e
* @return
*/
@Override
public boolean onTouch(View v, MotionEvent e) {
Log.i(TAG, "onTouchEvent " + ", action " + e.getAction() + ", e.rawY " + e.getRawY() + ",lastMotionY " + lastMotionY + ",downY " + downY);
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
downY = e.getRawY();
break;
case MotionEvent.ACTION_MOVE:
if (downY == Float.MIN_VALUE && lastMotionY == Float.MIN_VALUE) {
//not start from MOTION_DOWN, the child dispatch this first motion
downY = e.getRawY();
break;
}
float diff = e.getRawY() - (lastMotionY == Float.MIN_VALUE ? downY : lastMotionY);
lastMotionY = e.getRawY();
diff = diff / 2; //slow down viewpager scroll
Log.e(TAG, "scrollX " + dummyViewPager.getScrollX() + ",basescrollX " + dummyViewPager.getBaseScrollX());
if (dummyViewPager.getScrollX() != dummyViewPager.getBaseScrollX()) {
if (fakeDragVp(v, e, diff)) return true;
} else {
if (ViewCompat.canScrollVertically(v, (-diff) > 0 ? 1 : -1)) {
Log.e(TAG, "scroll vertically " + diff + ", move.lastMotionY " + e.getY());
break;
} else {
dummyViewPager.beginFakeDrag();
fakeDragVp(v, e, diff);
adjustDownMotion(v, e);
return true;
}
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (dummyViewPager.isFakeDragging()) {
try {
dummyViewPager.endFakeDrag();
} catch (Exception e1) {
Log.e(TAG, "", e1);
}
}
reset();
break;
}
return false;
}
এমনকি আমি এক্স এবং ওয়াই অদলবদল করে ভিউপেজারটিকে উল্লম্ব করে তুলতে একই সমস্যার মুখোমুখি হয়েছি। এটি মোটেই মসৃণ ছিল না।
কারণ এটি কেবল তখনই কাজ করত যখন সোয়াইপিংয়ের কোণটি .1.১২ degrees ডিগ্রি = আর্টিকান (১/৮) এর চেয়ে কম থাকাকালীন এবং স্পর্শের সময় ১৪ ডিগ্রি = আর্টিকান (১/৪) কম ছিল; অরিজিনাল ভিউপিজার হিসাবে অনুভূমিকভাবে একটি কাজ যখন সোয়াইপিংয়ের কোণটি 26.565 ডিগ্রি = আর্টিকান (1/2) এর চেয়ে কম থাকে তবে সংযুক্তি এবং স্পর্শের সময় 45 ডিগ্রি = আর্টিকান (1) থাকে।
এ কারণেই আমি অ্যান্ড্রয়েড সাপোর্ট-কোর-ইউআই কোডটি অনুলিপি করেছি এবং মানগুলিকে ভেরিয়েবলগুলিতে স্থানান্তরিত করেছি, যা প্রতিচ্ছবি ব্যবহার করে আমি বহুগুণে বৃদ্ধি পেয়েছি।
দয়া করে কোড এবং README এটি https://github.com/deepakmishra/verticalviewpager এবং VerticalViewPager https://github.com/deepakmishra/verticalviewpager/blob/master/app/src/main/java/com/viewpager/VerticalViewPager .java
আমি একটি নতুন ডাইরেকশনালভিউপেজার তৈরি করে শেষ করেছি যা উল্লম্ব বা অনুভূমিকভাবে স্ক্রোল করতে পারে কারণ আমি যে সমস্ত সমাধান দেখেছি সেগুলির মধ্যে ত্রুটি রয়েছে:
বিদ্যমান উল্লম্বভিউপাগার বাস্তবায়ন (কাস্তরফ্লেক্স এবং ল্যামবারগার দ্বারা)
স্থায়ী অদলবদল সহ রূপান্তর ট্রিক trick
VelocityTracker.computeCurrentVelocity
সত্ত্বেও এক্স অক্ষের সাহায্যে বেগটি গণনা করে, সম্ভবত কারণ এটি অভ্যন্তরীণভাবে একটি স্থানীয় কল ব্যবহার করে যা স্থানাঙ্কের অদলবদলকে উপেক্ষা করে।ঘূর্ণন দেখুন