android循环滚动
A. Android实现横纵滚动标题不动框架
用自定义标题栏。
用自定义标题栏,只要把系统自带的标题栏去掉就行。做法:requestWindowFeature(Window.FEATURE_NO_TITLE),自己再写两个布局块(LinearLayout布局)充当顶部和底部的标题栏即可,中间使用ScrollView即可完成。
如果应用需要添加水平滚动条,则可借助于另一个滚动视图HorizontalScrollView来实现。
B. 实现RecyclerView循环滚动
无限循环RecyclerView的完美实现方案
Android RecyclerView打造自动循环效果
C. android如何利用horizon scrollview实现循环滚动
把要滚动的布局放在scrollview里面,
D. Android 自动滚动的RecyclerView
RecycelrView 自动滚动,顶部item上移动,底部item有动画效果的出来,用于一些条目循环等操作,动漫自动观看
BRVAH官方使用指南(持续更新) -
GitHub - wangtao2855/PictureVideoDemo: RecyerlView自动滚动功能
E. 求助大神ScrollView循环滚动问题
android 中scrollview可以通过控制滑动速度的属性来解决太慢的问题,示例如下: /** * 快/慢滑动ScrollView */ public class SlowScrollView extends ScrollView { public SlowScrollView(Context context, AttributeSet attrs, int defStyle) ...
F. android怎么viewpager实现循环切换图片
Android中的ViewPager则实现了左右滑动的效果,ViewPager类提供了多界面切换的新效果。利用ViewPager实现图片循环滚动代码如下:
1、首先是布局文件,使用了一个ViewPager控件:
java"><spanstyle="padding:0px;margin:0px;font-size:14px;"><RelativeLayoutxmlns: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">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#33000000"
android:orientation="vertical"
android:padding="5dip">
<TextView
android:id="@+id/tv_image_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="第一个引导页面"
android:textColor="@android:color/white"
android:textSize="14sp"/>
<LinearLayout
android:id="@+id/ll_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
</RelativeLayout></span>
2、接下来实现一个继承PagerAdapter的MyAdapter类,实现一个PagerAdapter,代码如下:
<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.List;
importandroid.support.v4.view.PagerAdapter;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ImageView;
{
privateList<ImageView>mImageViewList;
publicViewPagerAdapter(List<ImageView>imageViewList){
super();
this.mImageViewList=imageViewList;
}
/**
*该方法将返回所包含的Item总个数。为了实现一种循环滚动的效果,返回了基本整型的最大值,这样就会创建很多的Item,
*其实这并非是真正的无限循环。
*/
@Override
publicintgetCount(){
returnInteger.MAX_VALUE;
}
/**
*判断出去的view是否等于进来的view如果为true直接复用
*/
@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
returnarg0==arg1;
}
/**
*销毁预加载以外的view对象,会把需要销毁的对象的索引位置传进来,就是position,
*因为mImageViewList只有五条数据,而position将会取到很大的值,
*所以使用取余数的方法来获取每一条数据项。
*/
@Override
publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){
container.removeView(mImageViewList.get(position%mImageViewList.size()));
}
/**
*创建一个view,
*/
@Override
publicObjectinstantiateItem(ViewGroupcontainer,intposition){
container.addView(mImageViewList.get(position%mImageViewList.size()));
returnmImageViewList.get(position%mImageViewList.size());
}
}
</span>
3、最后是主界面部分的代码:
<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.os.SystemClock;
importandroid.support.v4.view.ViewPager;
importandroid.support.v4.view.ViewPager.OnPageChangeListener;
importandroid.view.View;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.LinearLayout.LayoutParams;
importandroid.widget.TextView;
{
privateList<ImageView>imageViewList;
privateTextViewtvDescription;
privateLinearLayoutllPoints;
privateString[]imageDescriptions;
=0;
privateViewPagermViewPager;
privatebooleanisLoop=true;
privateHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1);
}
};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setView();
initView();
}
publicvoidsetView(){
setContentView(R.layout.activity_splash_viewpager);
//自动切换页面功能
newThread(newRunnable(){
@Override
publicvoidrun(){
while(isLoop){
SystemClock.sleep(2000);
handler.sendEmptyMessage(0);
}
}
}).start();
}
publicvoidinitView(){
mViewPager=(ViewPager)findViewById(R.id.viewpager);
tvDescription=(TextView)findViewById(R.id.tv_image_description);
llPoints=(LinearLayout)findViewById(R.id.ll_points);
prepareData();
ViewPagerAdapteradapter=newViewPagerAdapter(imageViewList);
mViewPager.setAdapter(adapter);
mViewPager.setOnPageChangeListener(this);
tvDescription.setText(imageDescriptions[previousSelectPosition]);
llPoints.getChildAt(previousSelectPosition).setEnabled(true);
/**
*2147483647/2=1073741820-1
*设置ViewPager的当前项为一个比较大的数,以便一开始就可以左右循环滑动
*/
intn=Integer.MAX_VALUE/2%imageViewList.size();
intitemPosition=Integer.MAX_VALUE/2-n;
mViewPager.setCurrentItem(itemPosition);
}
privatevoidprepareData(){
imageViewList=newArrayList<ImageView>();
int[]imageResIDs=getImageResIDs();
imageDescriptions=getImageDescription();
ImageViewiv;
Viewview;
for(inti=0;i<imageResIDs.length;i++){
iv=newImageView(this);
iv.setBackgroundResource(imageResIDs[i]);
imageViewList.add(iv);
//添加点view对象
view=newView(this);
view.setBackgroundDrawable(getResources().getDrawable(R.drawable.point_background));
LayoutParamslp=newLayoutParams(5,5);
lp.leftMargin=10;
view.setLayoutParams(lp);
view.setEnabled(false);
llPoints.addView(view);
}
}
privateint[]getImageResIDs(){
returnnewint[]{
R.drawable.bg1,
R.drawable.bg2,
R.drawable.bg3,
R.drawable.pic_01,
R.drawable.pic_02
};
}
privateString[]getImageDescription(){
returnnewString[]{
"第一个引导页面",
"第二个引导页面",
"第三个引导页面",
"第四个引导页面",
"第五个引导页面"
};
}
@Override
(intarg0){
}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
}
@Override
publicvoidonPageSelected(intposition){
//改变图片的描述信息
tvDescription.setText(imageDescriptions[position%imageViewList.size()]);
//切换选中的点,把前一个点置为normal状态
llPoints.getChildAt(previousSelectPosition).setEnabled(false);
//把当前选中的position对应的点置为enabled状态
llPoints.getChildAt(position%imageViewList.size()).setEnabled(true);
previousSelectPosition=position%imageViewList.size();
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
isLoop=false;
}
}
</span>
G. 如何让coordinatorlayout自动往上滚动 android
一个自动滚动,轮播循环视图组件。 使用 (1) 引入公共库 引入Android Auto Scroll ViewPager@Github作为你项目的library(如何拉取代码及添加公共库)。 (2) 调用 仅需简单两步: a. 布局定义 <cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="wrap_content" /> 代替一般的ViewPager定义 b. 启动ViewPager自动滚动 startAutoScroll() 启动自动滚动 stopAutoScroll() 停止自动滚动 3、设置 setInterval(long) 设置自动滚动的间隔时间,单位为毫秒 setDirection(int) 设置自动滚动的方向,默认向右 setCycle(boolean) 是否自动循环轮播,默认为true setScrollDurationFactor(double) 设置ViewPager滑动动画间隔时间的倍率,达到减慢动画或改变动画速度的效果 setStopScrollWhenTouch(boolean) 当手指碰到ViewPager时是否停止自动滚动,默认为true setSlideBorderMode(int) 滑动到第一个或最后一个Item的处理方式,支持没有任何操作、轮播以及传递到父View三种模式 setBorderAnimation(boolean) 设置循环滚动时滑动到从边缘滚动到下一个是否需要动画,默认为true 4、其他 (1) 指示器,圆形或是方形指示器请配合ViewPagerIndicator使用 (2)无限循环,如果希望在最后一张继续播放第一张而不是退回到第一张,请参考AutoScrollViewPagerSingleDemo.java,注意这个特性不能和 ViewPagerIndicator 使用。 要是还不能解决? 你来我们群里说吧 这里是开发者互相学习交流的 有大神 让他们给你解释你的疑问 q un号: 1881 68040
H. Android RecyclerView实现循环列表-点击事件
源码链接
效果图
实现步骤:
1.在build.gradle文件中加入recyclerView库
2.在main.xml中使用recyclerView布局
3.滚动列表中的每一项对应一个对象,他们属于同一类的实例。接着定义实体类,我做的是歌单列表,定义序号,名字和时长
4.设计列表项的样式
4.使用适配器为列表项设置显示的数据
4.1定义适配器的内部类与列表项绑定
4.2适配器继承自recyclerView.Adapter,要重写三个方法,创建列表项视图,复用加载,获取列表项数量,到这一步,循环列表已经可以实现滚动效果了。
5.为列表项添加点击监听事件,使用接口回调
5.1仍然是在适配器中,定义接口
5.2在onBindViewHolder中为列表项设置监听
5.3在MainActivity中使用,实现onclick方法
I. Android TV中实现RecyView循环功能
RecycleView 用法 :
1. [endif]在Gradle中添加
implementation 'com.android.support:recyclerview-v7:26.0.2'
2. [endif]在主布局文件里添加RecycleView
3. [endif]创建item布局文件
在电视开发中,需要添加focusable 与 focusableintouchmode 才可以获得焦点。
4. [endif]创建adapter继承RecyclerView.Adapter
5. [endif] 在adapter中添加缺省方法
1) [endif]On create ViewHolder()方法是将item布局加载到recycleView 的方法
View view = LayoutInflater. from (parent.getContext()).inflate(R.layout. item_2 , parent, false);
创建一个ViewHolder,并添加到ViewHolder里面去,最后返回这个ViewHolder:
ViewHolder holder = new ViewHolder(view);return holder;
2) OnbindViewHolder()是将ViewHolder绑定到RecycleView上面时调用的方法
可在这里做更新View的操作。
3) [endif]GetItemCount 方法为返回数据长度的方法。一般返回值为:
return XXX.size();
4) [endif]在adapter中创建一个viewHolder,继承
RecyclerView.ViewHolder
在这里创建item布局中的控件对象,在public ViewHolder(View itemView)
方法中初始化:
tvItem2 = itemView.findViewById(R.id. tv_item_2 );
6. 在adapter 中创建一个数据对象用来接收想要传入的数据,在结构体中接收传入的数据例如:
private List mData;
在Activity中的操作
1. [endif]创建recycleView对象,创建layoutManager(布局管理器)对象,创建adapter对象,创建数据对象
2. 实例化recycleView对象,layoutManager对象,adapter对象
RecycleView有几种布局管理器可用,可实现线性,网格,以及瀑布流的界面,以下为线性布局:
mlayoutManager = new LinearLayoutManager(this);
以下为网格布局:
//mlayoutManager = new GridLayoutManager(this,3,GridLayoutManager.HORIZONTAL,false);
3.为recycleview 设置布局管理器:
viewRecy2.setLayoutManager(mlayoutManager);
4.为recycleview设置adapter:
//3 设置数据适配器viewRecy2.setAdapter(myAdapter);
如果要在每一个item中添加事件,采取事件回调的方法,其他自定义View的回调皆类似,以下以添加点击事件为例:
1) 在adapter中添加点击事件的接口,并添加接口方法:
public interface onItemClickListener { void onItemClick(View view, int position);}
2) [endif]在adapter中创建接口实例
private onItemClickListener onItemClickListener;
3) 在adapter创建对应set方法体来接收Activity传入的对象
public void setOnItemClickListener(onItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener;}
4)在onbindViewholde中判断是否设置了监听器
if (onItemClickListener !=null) {
//为ItemView设置监听器
holder.tvItem2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position =holder.getLayoutPosition();
onItemClickListener.onItemClick(holder.tvItem2, position);
//onItemClickListener.onItemClick();
}
});
}
}
5) 最后在activity中通过adapter对象调用onset方法,实现点击事件
myAdapter.setOnItemClickListener(new MyAdapter.onItemClickListener() {
@Override
public void onItemClick(View view, int position) {
lastPosition =currentPosition;
currentPosition = position;
// Toast.makeText(RecycleActivity_2.this, "click+" + position, Toast.LENGTH_SHORT).show();
myAdapter.notifyItemChanged(currentPosition);
myAdapter.notifyItemChanged(lastPosition);
}
});
Android TV中RecycleView的Item循环实现
(1) 在TV中遥控器的按键取代了手机的滑动,因此我们要监听遥控器的按键,因此在adapter中的item监听setonkeylistener方法。
并获取item所在位置的position,存到tag里面
holder.tvItem2.setTag(position);
当在第一个Item中按向上键时,position<0,此时我们调用移动到最后一个,同理,当在最后一个时,移动到第一个。
smoothScrollToPosition(getItemCount() - 1)
holder.tvItem2.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
int action = event.getAction();
// Log.e("---", keyCode + "");
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
int positionUp = (int) v.getTag();
if (action == KeyEvent.ACTION_DOWN) {
if (positionUp <=0) {
recyclerView.smoothScrollToPosition(getItemCount() -1);
return true;
}
}
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
int positionDown = (int) v.getTag();
if (action == KeyEvent.ACTION_DOWN) {
if (positionDown >= getItemCount() -1) {
recyclerView.smoothScrollToPosition(0);
return true;
}
}
break;
}
return false;
}
});
(2) 然后在activity中封装了一个回滚方法来判断按键是否到达底部,并重新获取焦点
public void scroolChange(RecyclerView recyclerView, boolean toFirst, boolean toLast) {
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
int lastVisibleItem = manager.();
int firstVisibleItem = manager.();
int totalItemCount = manager.getItemCount();
//向下滚动,到底部
if (lastVisibleItem == (totalItemCount -1) && toLast) {
View view = recyclerView.getChildAt(lastVisibleItem);
LinearLayoutManager llM = (LinearLayoutManager) recyclerView.getLayoutManager();
if (view !=null) {
view.requestFocus();
}else if (llM.findViewByPosition(lastVisibleItem) !=null) {
llM.findViewByPosition(lastVisibleItem).requestFocus();
}else {
recyclerView.requestFocus();
}
}
//向上滚动,到顶部
if (firstVisibleItem ==0 && toFirst) {
View view = recyclerView.getChildAt(firstVisibleItem);
LinearLayoutManager llM = (LinearLayoutManager) recyclerView.getLayoutManager();
if (view !=null) {
view.requestFocus();
}else if (llM.findViewByPosition(firstVisibleItem) !=null) {
llM.findViewByPosition(firstVisibleItem).requestFocus();
}else {
recyclerView.requestFocus();
}
}
}
(3) 最后在recycleView 调用addscrolllistener方法,来监听recycleView的滚动状态
由于setonScrollListener有时回产生空指针,因此建议使用add方法
viewRecy2.addOnScrollListener(new RecyclerView.OnScrollListener() {
boolean toLast =false;
boolean toFirst =false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == recyclerView.SCROLL_STATE_IDLE) {
// Log.e("---", "底部");
scroolChange(recyclerView, toFirst, toLast);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy >0) {
toLast =true;
}else {
toFirst =true;
}
}
});
Add中包含两个方法,都可以来判断是否到达顶部或底部。至此,实现了Android TV中RecycleView的循环功能。
J. android开发图片(ImageView)要实现循环匀速滚动,速度可调,怎么实现呢,用什么组件好呢
采用画廊视图,GalleryView,自动匀速定时切换的话可以使用Timetask。网上搜一搜,很多案例。望采纳。