您的位置:首页 > 移动开发 > Android开发

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐