안 드 로 이 드 의 간단 한 그림 페이지 넘 기기 효과

레 퍼 런 스http://www.blogjava.net/wangxinsh55/archive/2011/09/21/359146.html실현,구체 적 인 코드 는 다음 과 같다.
public class PageWidget extends View {
	private Bitmap foreImage;
	private Bitmap bgImage;
	private PointF touchPt;
	private int screenWidth;
	private int screenHeight;
	private GradientDrawable shadowDrawableRL;
	private GradientDrawable shadowDrawableLR;
	private ColorMatrixColorFilter mColorMatrixFilter;
	private Scroller mScroller;
	private int lastTouchX;
	
	public PageWidget(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		touchPt = new PointF(-1,-1);
	
		//ARGB A(0-  ,255-   )
	    int[] color = { 0xb0333333 ,0x00333333};
	    shadowDrawableRL = new GradientDrawable(GradientDrawable.Orientation.RIGHT_LEFT, color);
	    shadowDrawableRL.setGradientType(GradientDrawable.LINEAR_GRADIENT);


	    shadowDrawableLR = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, color);
	    shadowDrawableLR.setGradientType(GradientDrawable.LINEAR_GRADIENT);
	    
         float array[] = { 0.55f,    0,    0,     0, 80.0f, 
        		   0    ,0.55f,    0,     0, 80.0f, 
          		   0    ,    0,0.55f,     0, 80.0f, 
        		   0    ,    0,    0,  0.2f, 0};
        ColorMatrix cm = new ColorMatrix();
        cm.set(array);
        /*
         * |A*0.55 + 80|
         * |R*0.55 + 80|
         * |G*0.55 + 80|
         * |B*0.2|
         */
//      cm.setSaturation(0);
        mColorMatrixFilter = new ColorMatrixColorFilter(cm);

        //                   
        mScroller = new Scroller(context);
	}

	@Override
	public void computeScroll() {
		// TODO Auto-generated method stub
		if (mScroller.computeScrollOffset()) {
			touchPt.x = mScroller.getCurrX();
			touchPt.y = mScroller.getCurrY();
			
			postInvalidate();
		}
		else{
//			touchPt.x = -1;
//			touchPt.y = -1;			
		}

		super.computeScroll();
	}

	public void SetScreen(int screenWidth,int screenHeight){
		this.screenWidth = screenWidth;
		this.screenHeight = screenHeight;
	}
	
	public Bitmap getForeImage() {
		return foreImage;
	}


	public void setForeImage(Bitmap foreImage) {
		this.foreImage = foreImage;
	}


	public Bitmap getBgImage() {
		return bgImage;
	}


	public void setBgImage(Bitmap bgImage) {
		this.bgImage = bgImage;
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		drawPageEffect(canvas);
		super.onDraw(canvas);
	}


	/**
	 *      
	 * @param canvas
	 */
	private void drawForceImage(Canvas canvas) {
		// TODO Auto-generated method stub
		Paint mPaint = new Paint();
		
		if (foreImage!=null) {
			canvas.drawBitmap(foreImage, 0, 0, mPaint);
		}		
	}


	/**
	 *      
	 * @param canvas
	 */
	private void drawBgImage(Canvas canvas,Path path) {
		// TODO Auto-generated method stub
		Paint mPaint = new Paint();
		
		if (bgImage!=null) {
			canvas.save();
			
			//          
			canvas.clipPath(path,Op.INTERSECT);
			canvas.drawBitmap(bgImage, 0, 0, mPaint);
			canvas.restore();
		}
	}


	/**
	 *      
	 * @param canvas
	 */
	private void drawPageEffect(Canvas canvas) {
		// TODO Auto-generated method stub
		drawForceImage(canvas);
		Paint mPaint = new Paint();
		if (touchPt.x!=-1 && touchPt.y!=-1) {
			//      
			canvas.drawLine(touchPt.x, 0, touchPt.x,screenHeight, mPaint);
			
			//       
			shadowDrawableRL.setBounds((int)touchPt.x - 20, 0 ,(int)touchPt.x, screenHeight);
			shadowDrawableRL.draw(canvas);
			
			//     
			float halfCut = touchPt.x + (screenWidth - touchPt.x)/2;
			canvas.drawLine(halfCut, 0, halfCut, screenHeight, mPaint);
			
			//             
			Rect backArea = new Rect((int)touchPt.x,0,(int)halfCut,screenHeight);
			Paint backPaint = new Paint();
			backPaint.setColor(0xffdacab0);
			canvas.drawRect(backArea, backPaint);
			
			//                   touchPt.x 
			Paint fbPaint = new Paint();
			fbPaint.setColorFilter(mColorMatrixFilter);
			Matrix matrix = new Matrix();
			
			matrix.preScale(-1,1);
			matrix.postTranslate(foreImage.getWidth() + touchPt.x,0);
			
			canvas.save();
			canvas.clipRect(backArea);
			canvas.drawBitmap(foreImage, matrix, fbPaint);
			canvas.restore();
			
			//        
			shadowDrawableRL.setBounds((int)halfCut - 50, 0 ,(int)halfCut, screenHeight);
			shadowDrawableRL.draw(canvas);
			
			Path bgPath = new Path();
			
			//          
			bgPath.addRect(new RectF(halfCut,0,screenWidth,screenHeight), Direction.CW);
			
			//        
			drawBgImage(canvas,bgPath);
			
			//        
			shadowDrawableLR.setBounds((int)halfCut, 0 ,(int)halfCut + 50, screenHeight);
			shadowDrawableLR.draw(canvas);
		}
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			touchPt.x = event.getX();
			touchPt.y =	event.getY();
		}
		else if(event.getAction() == MotionEvent.ACTION_MOVE){
			lastTouchX = (int)touchPt.x;
			touchPt.x = event.getX();
			touchPt.y =	event.getY();
			
			postInvalidate();
		}
		else if(event.getAction() == MotionEvent.ACTION_UP){
			int dx,dy;
			
			dy = 0;
			
			//    
			if (lastTouchX

효과 도 는 다음 과 같다.

좋은 웹페이지 즐겨찾기