zoukankan      html  css  js  c++  java
  • Android自定义View研究--View中的原点坐标和XML中布局自定义View时View触摸原点问题

    这里只做个汇总~。~独一无二



    Android自定义View研究--View中的原点坐标相关问题

    我们自定义了View,但是有没想过一个问题,就是View中的(0,0)坐标,也就是原点坐标在哪??我们是不是有时候很困惑,接下来我们就来研究View中的原点坐标相关的问题。


    一、new DuView时View的原点

    我们通过从View中绘制一条从原点到右下角的线来看看这个View中的原点和这个View的宽和高。这里我们从onDraw(Canvas canvas)中绘制,下面给出核心代码。

    DuView.java

     继承View  

     public class DuView extends View {

             /**
    	 * 定义一个画笔
    	 * */
    	Paint paint;
    	
    	/**
    	 * 绘制线的画笔
    	 * */
    	Paint linePaint;
    	
    	/**
    	 * 这个是我们要在Activity中初始化用的
    	 * */
    	public HelloView(Context context){
    		super(context);
    		Log.v("HelloView(Context context)","" + this.getHeight()+ "   " + this.getWidth());
    	}
    	/**
    	 * 这个是我们要在XML中初始化用的
    	 * */
    	public HelloView(Context context,AttributeSet attrs){
    		super(context, attrs);
    		Log.v("HelloView(Context context,AttributeSet attrs)","" + this.getHeight()+ "   " + this.getWidth());
    	}
    
    	/**
    	 * 绘制View
    	 * */
    	protected void onDraw(Canvas canvas){
    		Log.v("onDraw(Canvas canvas)","" + this.getHeight()+ "   " + this.getWidth());
    		canvas.drawColor(Color.WHITE);
    		initLinePaint();	// 初始化画笔
    		myUseBitmapFactory(canvas);
    		canvas.drawLine(0, 0, this.getWidth(), this.getHeight(), linePaint);
    	}
    	
    	@Override
    	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    		// TODO Auto-generated method stub
    		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    		Log.v("onMeasure","" + this.getHeight()+ "   " + this.getWidth());
    	}
    	/**
    	 * 初始化画笔
    	 * */
    	public void intiPaint(){
    		paint = new Paint();
    		// 设置画笔
    		paint.setColor(Color.GREEN);	// 绿色画笔
    		paint.setAntiAlias(true);		// 打开抗锯齿
    		paint.setTextSize(15);			// 设置字体大小
    	}
    	
    	/**
    	 * 初始化绘制线的画笔
    	 * */
    	public void initLinePaint(){
    		linePaint = new Paint();
    		// 设置画笔
    		linePaint.setColor(Color.GREEN);
    		linePaint.setAntiAlias(true);
    		linePaint.setStrokeWidth(5);	// 设置线宽
    	}
    	
    	// --> 使用BitmapFactory解析图片
    		public void myUseBitmapFactory(Canvas canvas){
    		// 定义画笔
    			Paint paint = new Paint();
    		// 获取资源流
    			Resources rec = getResources();
    			InputStream in = rec.openRawResource(R.drawable.haha);
    		// 设置图片
    			Bitmap bitmap =BitmapFactory.decodeStream(in);
    		// 绘制图片
    			canvas.drawBitmap(bitmap, 0, 20, paint);				
    		}
    	// --> 使用BitmapDrawable解析图片
    		public void myUseBitmapDrawable(Canvas canvas){
    		// 定义画笔
    			Paint paint = new Paint();
    		// 获得资源
    			Resources rec = getResources();
    		// BitmapDrawable
    			BitmapDrawable bitmapDrawable = (BitmapDrawable) rec.getDrawable(R.drawable.haha);
    		// 得到Bitmap
    			Bitmap bitmap = bitmapDrawable.getBitmap();
    		// 在画板上绘制图片
    			canvas.drawBitmap(bitmap, 20, 120,paint);
    		}
    	// --> 使用InputStream和BitmapDrawable解析图片
    		public void myUseInputStreamandBitmapDrawable(Canvas canvas){
    		// 定义画笔
    			Paint paint = new Paint();
    		// 获得资源
    			Resources rec = getResources();
    		// InputStream得到字符串
    			InputStream in = rec.openRawResource(R.drawable.haha);
    		// BitmapDrawable 解析数据流
    			BitmapDrawable bitmapDrawable =  new BitmapDrawable(in);
    		// 得到图片
    			Bitmap bitmap = bitmapDrawable.getBitmap();
    		// 绘制图片
    			canvas.drawBitmap(bitmap, 100, 100,paint);
    		}

     }  

         运行:

                  

    通过观察发现,View大小是从使用继承View的那个Label下开始

    计算的,也就是这个View原点是在Label的左下角开始,到屏幕的右下角结束。

    自己多试试,呵呵。

    二、使用XML中布局文件时的View原点。

       修改布局:

       MainActivity.java

    /**

     * 使用自定义的View

     * */

    public class MainActivity extends Activity {

        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.main);// 使用自定义的View

        }

    }

    这里直接给出运行结果图:

                   

    结束!

    !。!



    需要源码的留个邮箱~。~~。~

    文章出处http://blog.csdn.net/djy1992/article/details/9715047


    ------------

    Android自定义View研究(七)--XML中布局自定义View时View触摸原点问题

    在XML中布局时,我们自定义的View的触摸原点在哪??这又是一个问题啊,学习的过程就是不断发现问题,解决问题的过程。呵呵,相信大家都是深有体会吧,这次我们研究View的触摸原点问题。

    下面是核心代码:

        /**

         *定义手势识别

         **/

        GestureDetector mGestureDetector;

     

        /**

         *注册手势识别,当然这个要在构造里初始化一下

         **/

        publicvoid myEvent(){

           mGestureDetector = new GestureDetector(

                  new GestureDetector.SimpleOnGestureListener(){

                      publicboolean onSingleTapUp(MotionEvent e){

                         Log.v("onTouchEvent"," e.getX():" + e.getX()+ "   e.getY():"+ e.getY());

                         returntrue;

                      }

                  });

        }

     

     

        /**

         *响应触摸屏

         **/

        publicboolean onTouchEvent(MotionEvent event) {

           mGestureDetector.onTouchEvent(event);

           returntrue;

        }

     

    运行一下:

     

    下面是点击的示意图:

     

    点击后查看log

    需要源码的留个邮箱~。~~。~

    放外链太麻烦~

    文章出处http://blog.csdn.net/djy1992/article/details/9715047


  • 相关阅读:
    【spring源码学习】spring的IOC容器之自定义xml配置标签扩展namspaceHandler向IOC容器中注册bean
    【spring源码学习】spring的IOC容器在初始化bean过程
    【spring源码学习】Spring的IOC容器之BeanPostProcessor接口学习
    Zookeeper之Zookeeper的Client的分析
    Zookeeper之Zookeeper底层客户端架构实现原理(转载)
    【LIUNX】目录或文件权限,权限授予
    Java 8 日期时间API使用介绍
    Java 8中的 Streams API 详解
    Java 8 Lambda表达式介绍
    Java中Comparable和Comparator区别小结
  • 原文地址:https://www.cnblogs.com/new0801/p/6175852.html
Copyright © 2011-2022 走看看