2011-02-17 79 views
0

我发现这个类:如何实施ScrollImageView类在我的Android应用程序


import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.view.Display; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.WindowManager; 


// borrowed from https://sites.google.com/site/androidhowto/how-to-1/custom-scrollable-image-view 
public class ScrollImageView extends View { 
    private final int DEFAULT_PADDING = 10; 
    private Display mDisplay; 
    private Bitmap mImage; 

    /* Current x and y of the touch */ 
    private float mCurrentX = 0; 
    private float mCurrentY = 0; 

    private float mTotalX = 0; 
    private float mTotalY = 0; 
    /* The touch distance change from the current touch */ 
    private float mDeltaX = 0; 
    private float mDeltaY = 0; 

    int mDisplayWidth; 
    int mDisplayHeight; 
    int mPadding; 

    public ScrollImageView(Context context) { 
     super(context); 
     initScrollImageView(context); 
    } 

    public ScrollImageView(Context context, AttributeSet attributeSet) { 
     super(context); 
     initScrollImageView(context); 
    } 

    private void initScrollImageView(Context context) { 
     mDisplay = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
     mPadding = DEFAULT_PADDING; 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int width = measureDim(widthMeasureSpec, mDisplay.getWidth()); 
     int height = measureDim(heightMeasureSpec, mDisplay.getHeight()); 
     setMeasuredDimension(width, height); 
    } 

    private int measureDim(int measureSpec, int size) { 
     int result = 0; 
     int specMode = MeasureSpec.getMode(measureSpec); 
     int specSize = MeasureSpec.getSize(measureSpec); 

     if (specMode == MeasureSpec.EXACTLY) { 
      result = specSize; 
     } else { 
      result = size; 
      if (specMode == MeasureSpec.AT_MOST) { 
       result = Math.min(result, specSize); 
      } 
     } 
     return result; 
    } 

    public Bitmap getImage() { 
     return mImage; 
    } 

    public void setImage(Bitmap image) { 
     mImage = image; 
    } 

    public int getPadding() { 
     return mPadding; 
    } 

    public void setPadding(int padding) { 
     this.mPadding = padding; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      mCurrentX = event.getRawX(); 
      mCurrentY = event.getRawY(); 
     } 
     else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      float x = event.getRawX(); 
      float y = event.getRawY(); 

      // Update how much the touch moved 
      mDeltaX = x - mCurrentX; 
      mDeltaY = y - mCurrentY; 

      mCurrentX = x; 
      mCurrentY = y; 

      invalidate(); 
     } 
     // Consume event 
     return true; 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     if (mImage == null) { 
      return; 
     } 

     float newTotalX = mTotalX + mDeltaX; 

     // Don't scroll off the left or right edges of the bitmap. 
     if (mPadding > newTotalX && newTotalX > getMeasuredWidth() - mImage.getWidth() - mPadding) 
      mTotalX += mDeltaX; 

     float newTotalY = mTotalY + mDeltaY; 

     // Don't scroll off the top or bottom edges of the bitmap. 
     if (mPadding > newTotalY && newTotalY > getMeasuredHeight() - mImage.getHeight() - mPadding) 
      mTotalY += mDeltaY; 

     Paint paint = new Paint(); 
     canvas.drawBitmap(mImage, mTotalX, mTotalY, paint); 
    } 
}

,并很为难如何与我的应用程序中使用它。

我希望我的应用程序在横向方向显示可垂直和水平滚动的位图图像。我从URL中拉出图像并以编程方式将其变为位图。我调用一个返回我的位图图像的方法。

任何想法?

回答

1

setImage方法需要一个位图。因此,您应该能够以编程方式在您的活动中创建此视图,使用您的位图设置图像并将视图置于您的布局中。

我以前从未见过这个课,所以你的里程可能会有所不同;)

相关问题