简体   繁体   English

在onFling android中滑动效果

[英]Slide effect in onFling android

I've this code to swipe many images that i have in a string[] 我有这段代码可以滑动字符串中的许多图像[]

public class SlideShowUserImages extends ImageView implements TargetLoaded { 公共类SlideShowUserImages扩展了ImageView实现TargetLoaded {

private String[] urls;

private int curPos = 0;

private int imagesSize = 0;

private GestureDetector gdt;

private TargetImageView nextImageView;

private Dot[] dots;

//CANVAS
private int radius = 10;

private int dotMargin = 5;

private int dotYPos = -1;


private Paint selectedPaint;

private Paint normalPaint;


public SlideShowUserImages(Context context) {
    super(context);
    init(context, null);
}


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

public SlideShowUserImages(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public SlideShowUserImages(Context context, AttributeSet attrs, int defStyleAttr,
                     int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init(context, attrs);
}


private void init(Context context, AttributeSet attrs) {
    gdt = new GestureDetector(context, new GestureListener());
    nextImageView = new TargetImageView(this);
    setClickable(true);

    this.normalPaint = new Paint();
    this.selectedPaint = new Paint();
    this.normalPaint.setStyle(Paint.Style.FILL);
    this.selectedPaint.setStyle(Paint.Style.FILL);

    int dotNormalColor = Color.WHITE;
    int dotSelectedColor = Color.GRAY;

    TypedArray a = context.getTheme().obtainStyledAttributes(
            attrs,
            R.styleable.SlideShow,
            0, 0);

    try {
        dotNormalColor = a.getColor(R.styleable.SlideShow_dotNormal, Color.WHITE);
        dotSelectedColor = a.getColor(R.styleable.SlideShow_dotSelected, Color.GRAY);
        radius = a.getDimensionPixelSize(R.styleable.SlideShow_dotRadius, 10);
        dotMargin = a.getDimensionPixelSize(R.styleable.SlideShow_dotMargin, 5);
    } finally {
        a.recycle();
    }

    this.selectedPaint.setColor(dotSelectedColor);
    this.normalPaint.setColor(dotNormalColor);

    this.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return gdt.onTouchEvent(event);
        }
    });
}

public void start(String[] urls) {
    this.urls = urls;
    this.imagesSize = this.urls.length;

    // setup dots
    dots = new Dot[imagesSize];
    int dotY = 2 * radius - dotMargin;
    int dotWidth = 2 * radius + dotMargin;
    for (int i = 0; i < dots.length; i++) {
        dots[i] = new Dot((imagesSize / 2 - i) * dotWidth, dotY, radius);
    }

    getImageIntoView(0);
}


private void getImageIntoView(int position) {

    Picasso.with(getContext()).load(urls[position]).placeholder(R.drawable.ic_amigos).into(nextImageView);
}


protected void next() {
    curPos++;
    if (curPos > imagesSize - 1) {
        curPos = 0;
    }
    getImageIntoView(curPos);
}


protected void prev() {
    curPos--;
    if (curPos < 0) {
        curPos = imagesSize - 1;
    }
    getImageIntoView(curPos);
}

@Override
public void onTargetLoaded(Bitmap bitmap) {
    setImageBitmap(bitmap);
    invalidate();
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if (dots == null) {
        return;
    }

    int offsetX = canvas.getWidth() / 2;
    int offsetY = canvas.getHeight();
    for (int i = 0; i < dots.length; i++) {
        dots[i].render(canvas, offsetX, offsetY, (curPos == i) ? selectedPaint : normalPaint);
    }

}

private class Dot {

    private int posX, posY, radius;

    public Dot() {

    }

    public Dot(int posX, int posY, int radius) {
        this.posX = posX;
        this.posY = posY;
        this.radius = radius;
    }

    public void render(Canvas canvas, int offsetX, int offsetY, Paint paint) {
        /*canvas
                .drawCircle(offsetX - posX, offsetY - posY, radius, paint);*/
    }
}

private class GestureListener extends GestureDetector.SimpleOnGestureListener {

    private final int SWIPE_MIN_DISTANCE = 100;

    private final int SWIPE_THRESHOLD_VELOCITY = 70;

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            // Right to left, your code here
            next();
            return true;
        } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            // Left to right, your code here
            prev();
            return true;
        }
        return false;
    }
}


public class TargetImageView implements Target {

    TargetLoaded targetLoaded;

    public TargetImageView(TargetLoaded targetLoaded) {
        this.targetLoaded = targetLoaded;
    }

    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        targetLoaded.onTargetLoaded(bitmap);
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {

    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {

    }
}

} }

But this change the images like a flicker and the animation must to be slow 但这会像闪烁一样改变图像,并且动画必须缓慢

I think you are looking for View Pager. 我认为您正在寻找View Pager。

   <android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v4.view.ViewPager>

And inside your activity you can set an adapter to your viewpager. 在您的活动中,您可以为viewpager设置适配器。

viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(adapter);

Where adapter is an object of Class Adapter which can be defined by extending PagerAdapter. 其中adapter是类适配器的对象,可以通过扩展PagerAdapter来定义。

You can set your image inside the below method of Adapter Class 您可以在Adapter Class的以下方法中设置图像

@Override
public Object instantiateItem(ViewGroup container, int position){
 View view;
 LayoutInflater inflater=(LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE; 
 view=inflater.inflate(R.layout.your_layout,container,false);

ImageView imageview = (ImageView)view. findViewById(R.id.your_image);

//now set your image to the imageView
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM