Android 自定义ViewGroup无限轮播(本地图片)
2018-01-01 18:57
501 查看
BannerFrameLayout.java
public class BannerFrameLayout extends FrameLayout implements ImageBannerViewGroup.BannerDotListener {
private ImageBannerViewGroup mImageBannerViewGroup;
private LinearLayout mLinearLayout;
public ImageBannerViewGroup getmImageBannerViewGroup() {
return mImageBannerViewGroup;
}
public void setmImageBannerViewGroup(ImageBannerViewGroup mImageBannerViewGroup) {
this.mImageBannerViewGroup = mImageBannerViewGroup;
}
public LinearLayout getmLinearLayout() {
return mLinearLayout;
}
public void setmLinearLayout(LinearLayout mLinearLayout) {
this.mLinearLayout = mLinearLayout;
}
4000
private Integer[] banners;
public BannerFrameLayout(@NonNull Context context) {
this(context, null);
}
public BannerFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public BannerFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
initDragView();
initLinearLayout();
}
/**
* 设置Banner图的集合
*
* @param banners
* @param screenWidth 屏幕宽度
* @param screenHeight 屏幕高度
*/
public void addBanners(final Integer[] banners, int screenWidth, int screenHeight) {
this.banners = banners;
for (int i = 0; i < banners.length; i++) {
ImageView img = new ImageView(getContext());
img.setBackgroundResource(banners[i]);
img.setId(i);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(screenWidth * banners.length, screenHeight / 4);
img.setScaleType(ImageView.ScaleType.CENTER_CROP);
img.setLayoutParams(lp);
mImageBannerViewGroup.addView(img);
}
addDotToLinearLayout(banners.length);
}
private void addDotToLinearLayout(int dotCount) {
for (int i = 0; i < dotCount; i++) {
ImageView dot = new ImageView(getContext());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(5, 0, 0, 0);
dot.setBackgroundResource(R.mipmap.ic_launcher);
dot.setLayoutParams(lp);
mLinearLayout.addView(dot);
}
}
private void initLinearLayout() {
mLinearLayout = new LinearLayout(getContext());
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100);
lp.gravity = Gravity.BOTTOM;
mLinearLayout.setLayoutParams(lp);
mLinearLayout.setGravity(Gravity.CENTER);
addView(mLinearLayout);
}
private void initDragView() {
mImageBannerViewGroup = new ImageBannerViewGroup(getContext());
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
mImageBannerViewGroup.setLayoutParams(lp);
addView(mImageBannerViewGroup);
//调用自定义方法
mImageBannerViewGroup.setBannerDotListener(this);
}
@Override
public void bannerDotListener(int pos) {
for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
if (pos == i) {
ImageView img = (ImageView) mLinearLayout.getChildAt(i);
img.setBackgroundResource(R.drawable.dot_select);
} else {
ImageView img = (ImageView) mLinearLayout.getChildAt(i);
img.setBackgroundResource(R.drawable.dot_no_select);
}
}
}
}
ImageBannerViewGroup.java
public class ImageBannerViewGroup extends ViewGroup {
private int lastX; //滑动的上一次位置
private int childerCount; //子控件的个数
private int width; //屏幕的宽度
private int height; //Banner图的高度
private int index = 0; //Banner图索引
private int startX; //滑动的起始位置
private Timer timer;
private Boolean isClick = true; //是否点击
private Boolean isAuto = true; //是否自动轮播
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0) {
if (++index >= childerCount) {
index = 0;
}
if (bannerDotListener != null) {
bannerDotListener.bannerDotListener(index);
}
scrollTo(index * width, 0);
}
}
};
public void setAuto(Boolean isAuto) {
this.isAuto = isAuto;
}
public ImageBannerViewGroup(Context context) {
this(context, null);
}
public ImageBannerViewGroup(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public ImageBannerViewGroup(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if (isAuto) {
mHandler.sendEmptyMessage(0);
}
}
}, 1000, 2000);
}
//测量
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
childerCount = getChildCount();
if (childerCount == 0) {
setMeasuredDimension(0, 0);
} else {
measureChild(getChildAt(0), widthMeasureSpec, heightMeasureSpec);
DisplayMetrics dm = new DisplayMetrics();
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(dm);
width = dm.widthPixels;
height = dm.heightPixels / 3;//轮播图为手机全屏高度的三分之一
setMeasuredDimension(width * childerCount, height);
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (changed) {
int leftMargin = 0;
for (int i = 0; i < childerCount; i++) {
View view = getChildAt(i);
view.layout(leftMargin, 0, leftMargin + width, height);
leftMargin += width;
}
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isClick = true;
isAuto = false;
startX = (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
isClick = false;
lastX = (int) event.getX();
int offsetX = startX - lastX;
if (index == 0 && offsetX < 0) {
return true;
} else if (index == childerCount - 1 && offsetX > 0) {
return true;
}
scrollBy(offsetX, 0);
startX = lastX;
break;
case MotionEvent.ACTION_UP:
index = (getScrollX() + width / 2) / width;
Log.e("点击", "onTouchEvent:click " + isClick);
if (isClick && bannerImagClickListener != null) {
bannerImagClickListener.bannerClick(index);
Log.e("点击", "onTouchEvent:click " + index);
} else {
if (index < 0) {
index = 0;
} else if (index == childerCount - 1) {
index = childerCount - 1;
}
if (bannerDotListener != null) {
bannerDotListener.bannerDotListener(index);
}
scrollTo(index * width, 0);
isAuto = true;
}
break;
}
return true;
}
/**
* banner图点击事件回调接口
*/
public interface BannerImagClickListener {
void bannerClick(int pos);
}
private BannerImagClickListener bannerImagClickListener;
public void setBannerImagClickListener(BannerImagClickListener bannerImagClickListener) {
this.bannerImagClickListener = bannerImagClickListener;
}
/**
* banner图的dot点的滑动监听
*/
public interface BannerDotListener {
void bannerDotListener(int pos);
}
private BannerDotListener bannerDotListener;
public void setBannerDotListener(BannerDotListener bannerDotListener) {
this.bannerDotListener = bannerDotListener;
}
}
activity_main.xml
<com.example.moni.BannerFrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/mBannerFrameLayout"
></com.example.moni.BannerFrameLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity implements ImageBannerViewGroup.BannerImagClickListener {
private BannerFrameLayout banner;
private Integer[] imgs = {R.drawable.bg_1, R.drawable.bg_2, R.drawable.bg_3,
R.drawable.bg_4};
private int screenWidth;
private int screenHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().hide();
banner = (BannerFrameLayout) findViewById(R.id.mBannerFrameLayout);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;
banner.addBanners(imgs, screenWidth, screenHeight);
banner.getmImageBannerViewGroup().setBannerImagClickListener(this);
}
@Override
public void bannerClick(int pos) {
Toast.makeText(this, ""+pos, Toast.LENGTH_SHORT).show();
}
}
dot_no_select.png
dot_select.png
public class BannerFrameLayout extends FrameLayout implements ImageBannerViewGroup.BannerDotListener {
private ImageBannerViewGroup mImageBannerViewGroup;
private LinearLayout mLinearLayout;
public ImageBannerViewGroup getmImageBannerViewGroup() {
return mImageBannerViewGroup;
}
public void setmImageBannerViewGroup(ImageBannerViewGroup mImageBannerViewGroup) {
this.mImageBannerViewGroup = mImageBannerViewGroup;
}
public LinearLayout getmLinearLayout() {
return mLinearLayout;
}
public void setmLinearLayout(LinearLayout mLinearLayout) {
this.mLinearLayout = mLinearLayout;
}
4000
private Integer[] banners;
public BannerFrameLayout(@NonNull Context context) {
this(context, null);
}
public BannerFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public BannerFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
initDragView();
initLinearLayout();
}
/**
* 设置Banner图的集合
*
* @param banners
* @param screenWidth 屏幕宽度
* @param screenHeight 屏幕高度
*/
public void addBanners(final Integer[] banners, int screenWidth, int screenHeight) {
this.banners = banners;
for (int i = 0; i < banners.length; i++) {
ImageView img = new ImageView(getContext());
img.setBackgroundResource(banners[i]);
img.setId(i);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(screenWidth * banners.length, screenHeight / 4);
img.setScaleType(ImageView.ScaleType.CENTER_CROP);
img.setLayoutParams(lp);
mImageBannerViewGroup.addView(img);
}
addDotToLinearLayout(banners.length);
}
private void addDotToLinearLayout(int dotCount) {
for (int i = 0; i < dotCount; i++) {
ImageView dot = new ImageView(getContext());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(5, 0, 0, 0);
dot.setBackgroundResource(R.mipmap.ic_launcher);
dot.setLayoutParams(lp);
mLinearLayout.addView(dot);
}
}
private void initLinearLayout() {
mLinearLayout = new LinearLayout(getContext());
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100);
lp.gravity = Gravity.BOTTOM;
mLinearLayout.setLayoutParams(lp);
mLinearLayout.setGravity(Gravity.CENTER);
addView(mLinearLayout);
}
private void initDragView() {
mImageBannerViewGroup = new ImageBannerViewGroup(getContext());
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
mImageBannerViewGroup.setLayoutParams(lp);
addView(mImageBannerViewGroup);
//调用自定义方法
mImageBannerViewGroup.setBannerDotListener(this);
}
@Override
public void bannerDotListener(int pos) {
for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
if (pos == i) {
ImageView img = (ImageView) mLinearLayout.getChildAt(i);
img.setBackgroundResource(R.drawable.dot_select);
} else {
ImageView img = (ImageView) mLinearLayout.getChildAt(i);
img.setBackgroundResource(R.drawable.dot_no_select);
}
}
}
}
ImageBannerViewGroup.java
public class ImageBannerViewGroup extends ViewGroup {
private int lastX; //滑动的上一次位置
private int childerCount; //子控件的个数
private int width; //屏幕的宽度
private int height; //Banner图的高度
private int index = 0; //Banner图索引
private int startX; //滑动的起始位置
private Timer timer;
private Boolean isClick = true; //是否点击
private Boolean isAuto = true; //是否自动轮播
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0) {
if (++index >= childerCount) {
index = 0;
}
if (bannerDotListener != null) {
bannerDotListener.bannerDotListener(index);
}
scrollTo(index * width, 0);
}
}
};
public void setAuto(Boolean isAuto) {
this.isAuto = isAuto;
}
public ImageBannerViewGroup(Context context) {
this(context, null);
}
public ImageBannerViewGroup(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public ImageBannerViewGroup(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if (isAuto) {
mHandler.sendEmptyMessage(0);
}
}
}, 1000, 2000);
}
//测量
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
childerCount = getChildCount();
if (childerCount == 0) {
setMeasuredDimension(0, 0);
} else {
measureChild(getChildAt(0), widthMeasureSpec, heightMeasureSpec);
DisplayMetrics dm = new DisplayMetrics();
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(dm);
width = dm.widthPixels;
height = dm.heightPixels / 3;//轮播图为手机全屏高度的三分之一
setMeasuredDimension(width * childerCount, height);
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (changed) {
int leftMargin = 0;
for (int i = 0; i < childerCount; i++) {
View view = getChildAt(i);
view.layout(leftMargin, 0, leftMargin + width, height);
leftMargin += width;
}
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isClick = true;
isAuto = false;
startX = (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
isClick = false;
lastX = (int) event.getX();
int offsetX = startX - lastX;
if (index == 0 && offsetX < 0) {
return true;
} else if (index == childerCount - 1 && offsetX > 0) {
return true;
}
scrollBy(offsetX, 0);
startX = lastX;
break;
case MotionEvent.ACTION_UP:
index = (getScrollX() + width / 2) / width;
Log.e("点击", "onTouchEvent:click " + isClick);
if (isClick && bannerImagClickListener != null) {
bannerImagClickListener.bannerClick(index);
Log.e("点击", "onTouchEvent:click " + index);
} else {
if (index < 0) {
index = 0;
} else if (index == childerCount - 1) {
index = childerCount - 1;
}
if (bannerDotListener != null) {
bannerDotListener.bannerDotListener(index);
}
scrollTo(index * width, 0);
isAuto = true;
}
break;
}
return true;
}
/**
* banner图点击事件回调接口
*/
public interface BannerImagClickListener {
void bannerClick(int pos);
}
private BannerImagClickListener bannerImagClickListener;
public void setBannerImagClickListener(BannerImagClickListener bannerImagClickListener) {
this.bannerImagClickListener = bannerImagClickListener;
}
/**
* banner图的dot点的滑动监听
*/
public interface BannerDotListener {
void bannerDotListener(int pos);
}
private BannerDotListener bannerDotListener;
public void setBannerDotListener(BannerDotListener bannerDotListener) {
this.bannerDotListener = bannerDotListener;
}
}
activity_main.xml
<com.example.moni.BannerFrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/mBannerFrameLayout"
></com.example.moni.BannerFrameLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity implements ImageBannerViewGroup.BannerImagClickListener {
private BannerFrameLayout banner;
private Integer[] imgs = {R.drawable.bg_1, R.drawable.bg_2, R.drawable.bg_3,
R.drawable.bg_4};
private int screenWidth;
private int screenHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().hide();
banner = (BannerFrameLayout) findViewById(R.id.mBannerFrameLayout);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;
banner.addBanners(imgs, screenWidth, screenHeight);
banner.getmImageBannerViewGroup().setBannerImagClickListener(this);
}
@Override
public void bannerClick(int pos) {
Toast.makeText(this, ""+pos, Toast.LENGTH_SHORT).show();
}
}
dot_no_select.png
dot_select.png
相关文章推荐
- Android自定义View实现自动无限轮播,点击图片进入详情页
- EasySwift/YXJCycleView 任意视图的无限循环轮播图,可以是本地图片,可以是任意的view,可以是远程图片,再加文字描述岂不更好,pageController也支持高度自定义。
- android无限轮播banner图片--viewpager
- Android使用自定义控件实现加载本地图片无限轮播
- Android之自定义ViewPager实现图片的无线轮播
- Android 自定义Viewgroup之仿360手机助手详情页图片滑动
- Android 自定义viewpager 三张图片在同一屏幕轮播的效果
- android ViewPager实现的轮播图广告自定义视图,网络获取图片和数据
- Android ViewPager从网络获取图片实现无限轮播
- Android开发 自定义ViewGroup 实现微信九格图功能(图片不同排布不同) 和 一种图片点击变暗效果
- android 自定义无限循环播放的viewPager。轮播ViewPager。实现循环播放 广告,主题内容,活动,新闻内容时。
- Android自定义图片自动轮播控件:imagecycleview
- android中viewPager展示图片及无限轮播(一)
- Android viewpager无限轮播获取网络图片功能
- android viewPager网络加载图片无限自动轮播
- android中ViewPager+Picasso 实现轮播本地和网络图片源码
- Android 开发中的应用:ViewPager无限轮播(网络图片,小圆点)
- 自定义ViewPager 图片无限自动轮播
- ViewPager:真正实现图片的无限轮播、自定义指示点和条目点击事件(支持长按暂停滚动)
- Android自定义ViewGroup实现标签浮动效果