自定义ScrollView加回弹效果

看网上写的下拉刷新、下拉回弹,自己写了份,不足之处还请前辈指点...吐舌头



//自己封装的一个item类

public class Sprite{

private Bitmap bitmap;
protected int x;
protected int y;
protected int width;
protected int height;

public Sprite(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = x+width;
this.height = y+height;

}



public void drawSprite(Canvas canvas, Paint paint) {
if(bitmap==null)
return;
canvas.save();
Rect rect = new Rect(x,y, width, height);
canvas.clipRect(rect);
canvas.drawBitmap(bitmap, null, rect, paint);
canvas.restore();
rect = null;
}

@Override
public boolean myTouchEvent(MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN){
if(event.getX()>x&&event.getX()<width&&event.getY()>y&&event.getY()<height){
return true;
}
}
return false;
}


public int getX() {
return x;
}


public void setX(int x) {

this.x = x;
}


public int getY() {

return y;
}


public void setY(int y) {
this.y = y;
}


public int getWidth() {
return width;
}


public void setWidth(int width) {
this.width = width;
}


public int getHeight() {
return height;
}


public void setHeight(int height) {
this.height = height;
}

}



public class MyScrollView extends View {

//可移动的UI项
private List<Sprite> lsbt = new ArrayList<Sprite>();
private boolean isFirst;//是否绘制可向前滑动标识
private boolean isLast;//是否绘制可向后滑动标识
private Bitmap first,last;//向前、向后图片
private int index=0;//数据索引
public MyScrollView1(Context context, AttributeSet attrs) {
super(context, attrs);
BitmapManager.getInstance().loadSource(context);
//可移动的UI项个数
int count = 5;
// int count = (this.getWidth()/BitmapManager.getInstance().icons[index].getWidth())+1;
Log.i("TEST", "item_count"+count);
for(int i=0;i<count;i++){
Bitmap bitmap = BitmapManager.getInstance().icons[i];
Sprite sprite = new Sprite(i*bitmap.getWidth()+7,12,bitmap.getWidth(),bitmap.getHeight());
sprite.setBitmap(bitmap);
lsbt.add(sprite);
}
Log.i("TEST", "$$$$$$$$$$$$$$$$$$$$$size="+lsbt.size());
first = UtilTools.loadBitmap(context, R.drawable.icon15);
final Matrix matrix = new Matrix();
matrix.preRotate(180);
last =Bitmap.createBitmap(first, 0, 0, first.getWidth(), first.getHeight(), matrix, true);
isLast=true;
}
public MyScrollView1(Context context) {
this(context, null);
}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.i("TEST", "onMeasure:width="+this.getWidth());
}
@Override
protected void onVisibilityChanged(View changedView, int visibility) {
// TODO Auto-generated method stub
super.onVisibilityChanged(changedView, visibility);
Log.i("TEST", "onVisibilityChanged:width="+this.getWidth());
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(BitmapManager.getInstance().background2, 0,0, null);
for(int i=0;i<lsbt.size();i++){
Sprite sprite = lsbt.get(i);
//不绘制在屏幕外面的项
if(sprite.getX()>this.getWidth()||sprite.getWidth()<0)
continue;
lsbt.get(i).drawSprite(canvas, null);
}
if(isFirst){
canvas.drawBitmap(first, 12,17, null);
}
if(isLast){
canvas.drawBitmap(last, this.getWidth()-last.getWidth(), 17,null);
}
Log.i("TEST", "index="+index);
}
private float x1=0,x2=0;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x1=event.getX();
break;
case MotionEvent.ACTION_UP:
x1=0;
x2=0;
isFirst=true;
isLast = true;
//达到屏幕宽度的90%时,不在向右向左再滑动了
Sprite last=lsbt.get(lsbt.size()-1);
Log.i("TEST", "last:x="+last.getX()+",width="+last.getWidth());
if(last.getWidth()<this.getWidth()*90/100){
boolean flag = false;
while(!flag){
for(Sprite sprite:lsbt){
sprite.setX(sprite.getX()+5);
sprite.setWidth(sprite.getX()+sprite.getBitmap().getWidth());
}
Log.i("TEST", "******last:x="+last.getX()+",width="+last.getWidth());
if(last.getWidth()>=this.getWidth()){
flag = true;
isFirst = true;
isLast=false;
}
}
}
//达到屏幕宽度的10%时,不在再从左向右滑动了
Sprite first=lsbt.get(0);
Log.i("TEST", "first:x="+first.getX()+",width="+first.getWidth());
if(first.getX()>this.getWidth()*10/100){
boolean flag = false;
while(!flag){
for(Sprite sprite:lsbt){
sprite.setX(sprite.getX()-5);
sprite.setWidth(sprite.getX()+sprite.getBitmap().getWidth());
}
Log.i("TEST", "@@@@@@@first:x="+first.getX()+",width="+first.getWidth());
if(first.getX()<=0){
flag = true;
isLast = true;
isFirst = false;
}
}
}
break;
case MotionEvent.ACTION_MOVE:
x2 = event.getX();
Log.i("TEST", "x1="+x1+",x2="+x2);
if(x1-x2>150){//从右向左滑动
for(int i=0;i<lsbt.size();i++){
Sprite sprite =lsbt.get(i);
sprite.setX(sprite.getX()-3);
sprite.setWidth(sprite.getX()+sprite.getBitmap().getWidth());
}
// 把已经移出屏幕左边的项,增加到队后面
//当已经显示到数据项的最后一个时,不在向下执行
if (index >= BitmapManager.getInstance().icons.length - 1){
isLast = false;
break;
}
Sprite item = lsbt.get(0);
if (item.getWidth() < 0) {
lsbt.remove(item);//移除第一个项
index++;
item.setBitmap(BitmapManager.getInstance().icons[index]);
item.setX(lsbt.get(lsbt.size() - 1).getWidth() + 7);
item.setWidth(item.getX()
+ item.getBitmap().getWidth());
lsbt.add(item);//增加到队列尾部
}


}else if(x2-x1>150){//从左向右滑动
for(int i=0;i<lsbt.size();i++){
Sprite sprite =lsbt.get(i);
sprite.setX(sprite.getX()+3);
sprite.setWidth(sprite.getX()+sprite.getBitmap().getWidth());
}

// 把已经移出屏幕左边的项,增加到队后面
if (index <= 0){
isFirst = false;
break;
}
Sprite sprite = lsbt.get(lsbt.size()-1);
if (sprite.getX() > this.getWidth()) {
lsbt.remove(sprite);//移除最后一项
index--;
sprite.setBitmap(BitmapManager.getInstance().icons[index]);
sprite.setX(lsbt.get(0).getX() - 7
- sprite.getBitmap().getWidth());
sprite.setWidth(sprite.getX()
+ sprite.getBitmap().getWidth());
lsbt.add(0, sprite);//增加到队列前面
}
}
break;
}
postInvalidateDelayed(300);
return super.onTouchEvent(event);
}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值