自定义RelativeLayout

心乱红尘恋 2016-01-21 04:54:27
写了一个View继承RelativeLayout,在构造函数中加载了一个布局XML,这个布局有个背景图片,
在onDraw()中画了一个 Bitmap,但是这个 Bitmap 出现在 加载的布局背景图片 下面,
怎么能让onDraw()的Bitmap显示在背景图片上边?
...全文
193 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒲锦_up 2016-01-22
  • 打赏
  • 举报
回复
试试 在drow()中 加载布局文件看看
柒加伊 2016-01-22
  • 打赏
  • 举报
回复
这个还真不知道, 你都加载xml文件了, 为什么还要画一次 ? 不可以把bitmap加到xml文件里面吗. 你可以去查一下, LayoutInflat.inflat和onDraw()方法哪个先执行.
心乱红尘恋 2016-01-22
  • 打赏
  • 举报
回复

@SuppressLint({ "NewApi", "HandlerLeak" })
public class MySlideLockView extends RelativeLayout {
	private AnimationDrawable animatedw;
	
	private ImageView leftIv=null;
	private ImageView animateIv=null;
	private ImageView rightIv=null;
	
	private Bitmap dragBitmap=null;
	private Context mContext=null;
	private View conView=null;
	private Handler mainHandler=null; 
	
	private int startBoundar=0;
	private int endBoundar=0;
	private int viewLength=0;
	private int leftBoundar=0;
	private int rightBoundar=0;
	private int startPoint=0;
	private int centerPoint=0;
	private int endPoint=0;
	
	public MySlideLockView(Context context) {
		super(context);
		mContext = context;
		setWillNotDraw(false);
		init();
	}
	
	public MySlideLockView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		setWillNotDraw(false);
		init();
	}
	
	public MySlideLockView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mContext = context;
		setWillNotDraw(false);
		init();
	}
	
	private void init(){
		dragBitmap = BitmapFactory.decodeResource(mContext.getResources(),
				R.drawable.getup_slider_ico_pressed);
		
		conView=LayoutInflater.from(mContext).inflate(R.layout.myslideview, this, true);

		leftIv=(ImageView)conView.findViewById(R.id.leftImage);
		animateIv=(ImageView)conView.findViewById(R.id.animateImage);
		rightIv=(ImageView)conView.findViewById(R.id.rightImage);
		
		animatedw=(AnimationDrawable)animateIv.getBackground();
		animatedw.start();
	}
	
	int currentX=1000;
	@SuppressLint("ClickableViewAccessibility")
	@Override
	public boolean onTouchEvent(MotionEvent event){
		int x=(int)event.getX();
		switch(event.getAction()){
		case MotionEvent.ACTION_DOWN:
			currentX = (int) event.getX();
			return handleDownEvent(event);   
		case MotionEvent.ACTION_MOVE:
			currentX = x; 
			invalidate(); 		    
			return true;
		case MotionEvent.ACTION_UP:
			handleUpEvent(event);  
			return true;
		}
		return super.onTouchEvent(event);
	}
	
	private boolean handleDownEvent(MotionEvent event) {
		Rect rect=new Rect();
		leftIv.getHitRect(rect);
		boolean isHit = rect.contains((int) event.getX(), (int) event.getY());
		if(isHit){
			leftIv.setVisibility(View.INVISIBLE);
		}
		return isHit;
	}
	
	
	private static int BACK_DURATION = 1000 ;   
	
	private static float VE_HORIZONTAL = 0.007f ;  //0.1dip/ms
	
	private void handleUpEvent(MotionEvent event) {
		startBoundar=leftIv.getLeft();
		endBoundar=rightIv.getRight();
		viewLength=endBoundar-startBoundar;
		leftBoundar=viewLength/4+startBoundar;
		rightBoundar=viewLength/4*3+startBoundar;
		
		startPoint=startBoundar+leftIv.getWidth()/2;
		centerPoint=viewLength/2+startBoundar;
		endPoint=endBoundar-leftIv.getWidth()/2;
		
		int x=(int)event.getX();
		if(x<leftBoundar){  
			currentX=x;
			int distance=x-startPoint;
			if(distance>=2){
				mHandler.postDelayed(BackDragImgTask, BACK_DURATION);
			}else{
				resetViewState();
			}
		}else if(x>=leftBoundar&&x<rightBoundar){ 
			if(x<=centerPoint){
				currentX=x;
				int dis=centerPoint-currentX;
				if(dis>=2){
					mHandler.postDelayed(BackDragImgTask3, BACK_DURATION);
				}else{
					resetViewState();  
					virbate(); 
					mainHandler.obtainMessage(0).sendToTarget();
				}
			}else{
				currentX=x;
				int dis=currentX-centerPoint;
				if(dis>=2){
					mHandler.postDelayed(BackDragImgTask4, BACK_DURATION);
				}else{
					resetViewState();  
					virbate(); 
					mainHandler.obtainMessage(0).sendToTarget();
				}
			}
		}else if(x>=rightBoundar){  
			if(x<=endPoint){
				currentX=x;
				int dis=endPoint-currentX; 
				if(dis>=2){
					mHandler.postDelayed(BackDragImgTask2, BACK_DURATION);
				}else{
					resetViewState();  
					virbate(); 
					mainHandler.obtainMessage(1).sendToTarget();
				}
			}else if(x>endPoint){
				currentX=x;
				int dis=currentX-endPoint; 
				if(dis>=2){
					mHandler.postDelayed(BackDragImgTask5, BACK_DURATION);
				}else{
					resetViewState();  
					virbate(); 
					mainHandler.obtainMessage(1).sendToTarget();
				}
			}
			
		}
	}
	
	private void resetViewState() {
		leftIv.setVisibility(View.VISIBLE);
		currentX=1000;
		invalidate();
	}
	
	private void virbate() {
		Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
		vibrator.vibrate(200);
	}
	
	private Runnable BackDragImgTask5 = new Runnable(){
		
		public void run(){
			Log.e("backDragImgTask","555555555555");
			currentX =currentX - (int)(BACK_DURATION * VE_HORIZONTAL);
			invalidate();		
			boolean shouldEnd = currentX-endPoint <= 2 ;			
			if(!shouldEnd)
			    mHandler.postDelayed(BackDragImgTask5, BACK_DURATION);
			else { 
				resetViewState();
				virbate(); 
				mainHandler.obtainMessage(2).sendToTarget();
				mHandler.removeCallbacks(BackDragImgTask5);
			}				
		}
	};
	
	private Runnable BackDragImgTask2 = new Runnable(){
		
		public void run(){
			Log.e("backDragImgTask","22222222222222");
			currentX =currentX + (int)(BACK_DURATION * VE_HORIZONTAL);
			invalidate();		
			boolean shouldEnd = Math.abs(endPoint-currentX) <= 2 ;			
			if(!shouldEnd)
			    mHandler.postDelayed(BackDragImgTask2, BACK_DURATION);
			else { 
				resetViewState();
				virbate(); 
				mainHandler.obtainMessage(2).sendToTarget();
				mHandler.removeCallbacks(BackDragImgTask2);
			}				
		}
	};
	
	private Runnable BackDragImgTask = new Runnable(){
		
		public void run(){
			Log.e("backDragImgTask","11111111111");
			currentX = currentX - (int)(BACK_DURATION * VE_HORIZONTAL);
			invalidate();	
			boolean shouldEnd = Math.abs(currentX - startPoint) <= 2 ;			
			if(!shouldEnd)
			    mHandler.postDelayed(BackDragImgTask, BACK_DURATION);
			else { 
				resetViewState();	
				virbate(); 
				mainHandler.obtainMessage(0).sendToTarget();
				mHandler.removeCallbacks(BackDragImgTask);
			}				
		}
	};
	
	private Runnable BackDragImgTask3 = new Runnable(){
		
		public void run(){
			Log.e("backDragImgTask","333333333333");
			currentX =currentX + (int)(BACK_DURATION * VE_HORIZONTAL);
			invalidate();		
			boolean shouldEnd =centerPoint-currentX<= 2 ;			
			if(!shouldEnd)
			    mHandler.postDelayed(BackDragImgTask3, BACK_DURATION);
			else { 
				resetViewState();
				virbate(); 
				mainHandler.obtainMessage(1).sendToTarget();
				mHandler.removeCallbacks(BackDragImgTask3);
			}				
		}
	};
	
	private Runnable BackDragImgTask4 = new Runnable(){
		
		public void run(){
			Log.e("backDragImgTask","44444444444");
			currentX =currentX - (int)(BACK_DURATION * VE_HORIZONTAL);
			invalidate();		
			boolean shouldEnd =currentX-centerPoint<= 2 ;			
			if(!shouldEnd)
			    mHandler.postDelayed(BackDragImgTask4, BACK_DURATION);
			else { 
				resetViewState();
				virbate();
				mainHandler.obtainMessage(1).sendToTarget();
				mHandler.removeCallbacks(BackDragImgTask4);
			}				
		}
	};
	
	private Handler mHandler =new Handler (){
		
		public void handleMessage(Message msg){
			
		}
	};
	
	@Override
	public void onDraw(Canvas canvas){
		super.onDraw(canvas);
		int drawXCor = currentX-leftIv.getWidth()/2;
		int drawYCor = leftIv.getTop();
	    canvas.drawBitmap(dragBitmap,  drawXCor < 0 ? 5 : drawXCor , drawYCor , null);
	}
	
	public void setMainHandler(Handler handler){
		mainHandler = handler;
	}
}







ganshenml 2016-01-21
  • 打赏
  • 举报
回复
代码贴出来

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧