zoukankan      html  css  js  c++  java
  • Android中利用画图类和线程画出闪烁的心形

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    本文讲解主要涉及的知识点:
    1.线程控制 
    2.画图类 
    3.心形函数
    大家先看图片:
    <ignore_js_op>
    因为前一段时间在写画图类,刚好有一个线程控制画图闪烁的,我就想说我能不能做一个心形闪烁的,出来的效果就如图,先贴再讲解代码:
    里面设置两个类,一个是我们的activity类,这个类用来显示示图,然后建一个继承SurfaceView的类,我们在这里面画图。先贴两个累的代码:
    主类名:GameMainActivity,画图类类名:Love.
    public class MainActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    //		setContentView(new FxCanvasView(this, null));
    		setContentView(new Love(this));
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    }
    

      

    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.RectF;
    import android.graphics.Typeface;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    
    /**
     * @author CZ
     * 
     */
    public class Love extends SurfaceView implements SurfaceHolder.Callback,
            Runnable {
    
        boolean mbloop = false;
        SurfaceHolder mSurfaceHolder = null;
        private Canvas canvas;
        int miCount = 0;
        int y = 50;
    
        /**
         * @param context
         */
        public Love(Context context) {
            super(context);
            mSurfaceHolder = this.getHolder();
            mSurfaceHolder.addCallback(this);
            this.setFocusable(true);
            this.setKeepScreenOn(true);
            mbloop = true;
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see
         * android.view.SurfaceHolder.Callback#surfaceChanged(android.view.SurfaceHolder
         * , int, int, int)
         */
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub
    
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see
         * android.view.SurfaceHolder.Callback#surfaceCreated(android.view.SurfaceHolder
         * )
         */
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            new Thread(this).start();
        }
    
        /*
         * (non-Javadoc)
         * 
         * @seeandroid.view.SurfaceHolder.Callback#surfaceDestroyed(android.view.
         * SurfaceHolder)
         */
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            mbloop = false;
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see java.lang.Runnable#run()
         */
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (mbloop) {
                try {
                    Thread.sleep(200);
                } catch (Exception e) {
                    // TODO: handle exception
                }
                synchronized (mSurfaceHolder) {
                    Draw();
                }
            }
        }
    
        /**
         * 
         * Year:2011 Date:2011-7-27 Time:下午06:52:04 Author:CZ TODO
         */
        private void Draw() { 
             // TODO Auto-generated method stub 
             canvas = mSurfaceHolder.lockCanvas(); 
             try { 
                 if (mSurfaceHolder == null || canvas == null) { 
                     return; 
                 } 
                 if (miCount < 100) { 
                     miCount++; 
                 } else { 
                     miCount = 0; 
                 } 
                 Paint paint = new Paint(); 
                 paint.setAntiAlias(true); 
                 paint.setColor(Color.BLACK); 
                 canvas.drawRect(0, 0, 320, 480, paint); 
                 switch (miCount % 6) { 
                 case 0: 
                     paint.setColor(Color.BLUE); 
                     break; 
                case 1: 
                     paint.setColor(Color.GREEN); 
                     break; 
                 case 2: 
                     paint.setColor(Color.RED); 
                     break; 
                 case 3: 
                     paint.setColor(Color.YELLOW); 
                     break; 
                 case 4: 
                     paint.setColor(Color.argb(255, 255, 181, 216)); 
                     break; 
                 case 5: 
                     paint.setColor(Color.argb(255, 0, 255, 255)); 
                     break; 
                 default: 
                     paint.setColor(Color.WHITE); 
                     break; 
                 } 
                 int i, j; 
                 double x, y, r; 
     
                 for (i = 0; i <= 90; i++) { 
                     for (j = 0; j<= 90; j++) { 
                         r = Math.PI / 45 * i * (1 - Math.sin(Math.PI / 45 * j)) 
                                 * 20; 
                         x = r * Math.cos(Math.PI / 45 * j) 
                                 * Math.sin(Math.PI / 45 * i) + 320 / 2; 
                         y = -r * Math.sin(Math.PI / 45 * j) + 400 / 4; 
                         canvas.drawPoint((float) x, (float) y, paint); 
                     } 
                 } 
     
                 paint.setTextSize(32); 
                 paint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.ITALIC)); 
     
                 RectF rect = new RectF(60, 400, 260, 405); 
                 canvas.drawRoundRect(rect, (float) 1.0, (float) 1.0, paint); 
                 canvas.drawText("Loving You", 75, 400, paint); 
                 mSurfaceHolder.unlockCanvasAndPost(canvas); 
             } catch (Exception e) { 
             } 
     
         }
    }
    关于这个程序要讲解的几点:
    1. 画图的时候你可以继承View,也可以继承SurfaceView,这两者的区别在于:surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,还有涉及的surfaceCreated(SurfaceHolder holder),surfaceDestroyed(SurfaceHolder holder),surfaceChanged(SurfaceHolder holder, int format, int width, int height)方法,而在SurfaceHolder.Callback 接口回调中可以通过重写来改变这些方法
    2.程序其实很简单, 既然生命了Runnable接口,就有相对应的Run方法,在surfaceCreate()的时候开启线程,线程每隔200ms就刷新一次,这样我们看到的效果就是闪烁的,每200毫秒 画一次图,根据经过的间隔时间来设置画笔的颜色,然后通过循环描点,画出心形,然后设置字体大小,画字和字下面的横线。
    3.关于心形函数,是从一个例子中看来得,关于x和y的得到,
    x = r * Math.cos(Math.PI / 45 * j)  * Math.sin(Math.PI / 45 * i) + 320 / 2;  y = -r * Math.sin(Math.PI / 45 * j) + 400 / 4;
    320是屏幕的宽度,本来竖屏我设置的是480,可是下面得写字,就设置为400的了,关于画更好看的心形还有一个函数,大家可以看下:
  • 相关阅读:
    Linux统计文件夹下所有文件的数量
    Linux查看文件最后几行的命令
    linux export将PATH环境变量误删了的解决办法
    laravel提示Mcrypt PHP extension required
    php(cli模式)执行文件传递参数
    shell判断文件是否存在,不存在则创建
    php获取Linux网卡信息
    使用iptraf,ifstat查看网络流量
    作用域
    头文件,库文件,重复包含
  • 原文地址:https://www.cnblogs.com/zgz345/p/3287802.html
Copyright © 2011-2022 走看看