Androidの短いビデオ再生をスライディング()


本論文では、PagerSnapHelperとRecyclerViewの使用は、短いビデオ再生スライドコンテンツを達成記述する。

ショートビデオ.GIF

1.ホームページのコンテンツの構築

ホームレイアウトファイルはRecyclerView、対応アダプタRecyclerViewを定義します。

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rv_little_video"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

ビデオ再生アダプタエントリでframeLayout容器及びカバーImageViewのを追加します。

<FrameLayout
    android:id="@+id/fl_content_item"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black">

<ImageView
    android:id="@+id/iv_thumb_item"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerCrop" />

</FrameLayout>

RecyclerViewスライド管理を定義します。2.

PagerSnapHelperはLinearLayoutManagerのリアライズスライド管理、および監視タスクを組み合わせます。

PagerSnapHelperはじめに

PagerSnapHelperはと同様の挙動を達成することができ
ViewPagerを。android.view.ViewGroup.LayoutParams#MATCH_PARENTの高さと幅を有し、その後#attachToRecyclerView(RecyclerView)を}使用RecyclerViewにPagerSnapHelperを取り付けるRecyclerViewとRecyclerView.Adapterのアイテムの両方を設定します。

翻訳:PagerSnapHelperは以下同様の動作を達成することができ
ViewPagerを。RecyclerViewとRecyclerView.Adapter項目が高さを有するように設定され、A幅android.view.ViewGroup.LayoutParams#MATCH_PARENT次いでPagerSnapHelper RecyclerViewに付加#attachToRecyclerView(RecyclerView)を}使用します。


カスタムRecyclerViewマネージャー

LinearLayoutManagerは、あなたが横方向のスライドを使用したい場合は、縦方向にスライドするデフォルトRecyclerViewマネージャは、スライド方向はRecyclerView.HORIZONTALに設定されています。同様に、我々はまた、摺動方向を変化させるsetOrientation(RecyclerView.HORIZONTAL)メソッドを使用することができます。

public class PagerLayoutManager extends LinearLayoutManager implements RecyclerView.OnChildAttachStateChangeListener {

    private OnPageChangedListener mOnPageChangedListener;
    
    private PagerSnapHelper mSnapHelper;
    
    /**
     * 移动方向标记
     */
    private int direction;
    
    public PagerLayoutManager(Context context) {
        super(context);
        mSnapHelper = new PagerSnapHelper();
    }
    
    /**
     * PagerSnapHelper绑定RecyclerView,同时为监听RecyclerView子布局附着,脱离,进行滑动页面内容控制
     *
     * @param view RecyclerView
     */
    @Override
    public void onAttachedToWindow(RecyclerView view) {
        super.onAttachedToWindow(view);
        mSnapHelper.attachToRecyclerView(view);
        view.addOnChildAttachStateChangeListener(this);
    }
    
    /**
     * 滑动状态改变监听,滑动完毕后进行播放控制
     *
     * @param state 滑动状态
     */
    @Override
    public void onScrollStateChanged(int state) {
    super.onScrollStateChanged(state);
    
        if (state == RecyclerView.SCROLL_STATE_IDLE) {
            View view = mSnapHelper.findSnapView(this);
            if (view == null) {
                return;
            }
            int position = getPosition(view);
            if (mOnPageChangedListener != null && getChildCount() == 1) {
                mOnPageChangedListener.onPageSelected(position, position == getItemCount() - 1);
            }
        }
    
    }
    
    @Override
    public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
        direction = dx;
        return super.scrollHorizontallyBy(dx, recycler, state);
    }
    
    @Override
    public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
        direction = dy;
        return super.scrollVerticallyBy(dy, recycler, state);
    }
    
    @Override
    public void onChildViewAttachedToWindow(@NonNull View view) {
        if (mOnPageChangedListener != null && getChildCount() == 1) {
            mOnPageChangedListener.onPageInitComplete();
        }
    }
    
    @Override
    public void onChildViewDetachedFromWindow(@NonNull View view) {
        if (mOnPageChangedListener != null) {
            mOnPageChangedListener.onPageRelease(getPosition(view), direction >= 0);
        }
    }
    
    public void setOnPageChangedListener(OnPageChangedListener mOnPageChangedListener) {
        this.mOnPageChangedListener = mOnPageChangedListener;
    }
    
    public interface OnPageChangedListener {
    
        /**
         * 初始化子布局加载完成
         */
        void onPageInitComplete();
        
        /**
         * 子布局脱离
         *
         * @param position 子布局在RecyclerView位置
         * @param isNext   是否有下一个
         */
        void onPageRelease(int position, boolean isNext);
        
        /**
         * 子布局附着
         *
         * @param position 子布局在RecyclerView位置
         * @param isLast   是否最后一个
         */
        void onPageSelected(int position, boolean isLast);
    }

}

3.スライドビデオを達成

RecyclerViewマネージャーPagerLayoutManagerとして、アダプタは、そのデータ内容、カバーの表示を設定し、この時間は、コールバックonPageInitComplete()メソッドは、最初のビデオの再生であろう。最初のコールバックマネージャは()メソッドをonPageReleaseますRecyclerViewスライド、ページの終了後にスライドするために、あなたはストップ解除にプレーヤーにすることができ、次に、コールバックはonPageSelected()メソッド、プレーヤー上に表示するためのページコンテンツを選択します。

スライドを解除する場合、現在位置は、このページまたは繰り返しビデオ停止を回避するために、実行することが決定されます。

mPagerLayoutManager = new PagerLayoutManager(this);
mPagerLayoutManager.setOnPageChangedListener(new PagerLayoutManager.OnPageChangedListener() {
@Override
public void onPageInitComplete() {
    int position = mPagerLayoutManager.findFirstVisibleItemPosition();
    if (position != -1) {
        mCurrentPosition = position;
    }
    startPlay(mCurrentPosition);
}

@Override
public void onPageRelease(int position, boolean isNext) {
    if (mCurrentPosition == position) {
        stopPlay();
    BaseViewHolder viewHolder = (BaseViewHolder) mRvLittleVideo.findViewHolderForLayoutPosition(mCurrentPosition);
    if (viewHolder != null) {
        ImageView mVideoThumb = viewHolder.getView(R.id.iv_thumb_item);
    if (mVideoThumb != null) {
        mVideoThumb.setVisibility(View.VISIBLE);
    }
    }
    }
}

@Override
public void onPageSelected(int position, boolean isLast) {
    if (mCurrentPosition == position) {
        return;
    }
    startPlay(position);
    mCurrentPosition = position;
    }
});

mRvLittleVideo.setLayoutManager(mPagerLayoutManager);

mLittleVideoAdapter = new LittleVideoAdapter();
mRvLittleVideo.setAdapter(mLittleVideoAdapter);

3.プレーヤーの初期化や停止、プレイ

初期プレーヤーのコンテンツ

private void initVideo() {

    mVideoView = new LittleVideoView(this);
    GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_FULL);
    mGsySmallVideoHelperBuilder = new GSYVideoOptionBuilder();
    mGsySmallVideoHelperBuilder
            .setLooping(true)
            .setCacheWithPlay(true)
            .setIsTouchWiget(false)
            .setVideoAllCallBack(new GSYSampleCallBack() {
                @Override
                public void onPrepared(String url, Object... objects) {
                    super.onPrepared(url, objects);

                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            BaseViewHolder viewHolder = (BaseViewHolder) mRvLittleVideo.findViewHolderForLayoutPosition(mCurrentPosition);
                            if (viewHolder != null) {
                                ImageView mVideoThumb = viewHolder.getView(R.id.iv_thumb_item);
                                if (mVideoThumb != null) {
                                    mVideoThumb.setVisibility(View.INVISIBLE);
                                }
                            }
                        }
                    }, 100);
                }
            });
}

映像コンテンツの再生を開始し、プレーヤーのビューのロード

private void startPlay(int position) {
    if (position < 0 || position >= mLittleVideoAdapter.getData().size()) {
        return;
    }
    BaseViewHolder holder = (BaseViewHolder) mRvLittleVideo.findViewHolderForLayoutPosition(position);
    ViewParent parent = mVideoView.getParent();
    if (parent instanceof FrameLayout) {
        ((ViewGroup) parent).removeView(mVideoView);
    }
    if (holder != null) {
        FrameLayout mVideoContent = holder.getView(R.id.fl_content_item);
        mVideoContent.addView(mVideoView, 0);
        mGsySmallVideoHelperBuilder.setUrl(mLittleVideoAdapter.getData().get(position).getUrl());
        mGsySmallVideoHelperBuilder.build(mVideoView);
        mVideoView.startPlayLogic();
    }
}

再生の中止、削除ビュー

private void stopPlay() {
    mVideoView.release();
    ViewParent parent = mVideoView.getParent();
    if (parent instanceof FrameLayout) {
        ((FrameLayout) parent).removeView(mVideoView);
    }
}

3.プレーヤーのコンテンツ

例はGSYオープンプレーヤーから継承したカスタムレイアウト空間プレーヤー、ビデオプレーヤーだけで、もちろん、使用する他のプレイヤーIjkPlayer餃子などを使用して。

public class LittleVideoView extends StandardGSYVideoPlayer {

    public LittleVideoView(Context context, Boolean fullFlag) {
        super(context, fullFlag);
    }

    public LittleVideoView(Context context) {
        super(context);
    }

    public LittleVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public int getLayoutId() {
        return R.layout.empty_control_video;
    }
}

レイアウトファイル

<?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"
    android:background="@android:color/black">

    <FrameLayout
    android:id="@+id/surface_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">
    
    </FrameLayout>

</RelativeLayout>

これらの単純なスライドプレイは、完了した例ばかりで実現する方法と、誰もが参照を学ぶためのアイデアを提供し、実際の使用が封入されてもよいし、その更なる処理は、次のプレーヤーは、いくつかのスライドアダプタを追加しますロードデータ処理とマルチレイアウトコンテンツ提示のように。

ショートビデオ再生アンドロイドスライド(II)

ノー国民の関心:より興味深い技術、ツール、ゴシップ、リソースを参照してくださいするために数回を鳴らします。
いいえ公共.JPGありません

おすすめ

転載: www.cnblogs.com/jqnl/p/12131965.html