info5

android 继承view类刷新页面【安卓进化十一】

我爱IT资讯库   2021/02/23

       最近做项目中发现,继承了view类的子类,可以用invalidate方法刷新,或者用hanlder消息机制和线程来处理,或者直接在线程中用postInvalidate来处理,但是继承了surface的子类,就不可以用invalidate方法来刷新界面。我写了个简单刷新界面加载图片的demo,先看效果图:

                  程序图:没有点击事件                                    点击男生前面圆圈的效果,再次点击消失

           android 继承view类刷新页面【安卓进化十一】_第1张图片       android 继承view类刷新页面【安卓进化十一】_第2张图片   

               点击矩形区域:下箭头                                              效果图:数字改变              

          android 继承view类刷新页面【安卓进化十一】_第3张图片         android 继承view类刷新页面【安卓进化十一】_第4张图片 

                  点击矩形区域:  上箭头                                                          数字改变,增加:

                 android 继承view类刷新页面【安卓进化十一】_第5张图片                   android 继承view类刷新页面【安卓进化十一】_第6张图片

 

一、MainActivity类的代码:

package com.cn.android;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {
   
 public static final int REFRESH = 0;
 public static final int RETURN = 1;
 public static final int REGAIN = 2;
 
 GameView mGameView = null;// = new GameView(this,this);
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,  
                       WindowManager.LayoutParams.FLAG_FULLSCREEN);
        this.initGameView();
        new Thread(new GameThread()).start();
    }
  
    Handler mHandler=new Handler(){
  public void handleMessage(Message msg) {
   switch(msg.what){
    case MainActivity.REFRESH:
      mGameView.postInvalidate();        //刷新界面
                  break;
    case MainActivity.REGAIN:
      initGameView();
      break;
    case MainActivity.RETURN:
      initReturn();
      break;
    default: break;
   }
  }
 };
    
    public void initGameView(){
     mGameView = new GameView(this,this);
     setContentView(mGameView);
    }
    
    public void initReturn(){
     //结束程序
     System.exit(0);
    }
    
 class GameThread implements Runnable
 {
  public void run()
  {
   while (!Thread.currentThread().isInterrupted())
   {
    Message message = new Message();
    message.what = MainActivity.REFRESH;
    // 发送消息
    MainActivity.this.mHandler.sendMessage(message);
    try
    {
     Thread.sleep(100);
    }
    catch (InterruptedException e)
    {
     Thread.currentThread().interrupt();
    }
   }
  }
 }

}


二、GameView类的代码:

package com.cn.android;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;

public class GameView extends View{
 
 private MainActivity activity;
 private Bitmap bggame_image;
 private Bitmap game_Spoint;
 private Bitmap game_Dpoint;
 
 private boolean showSpoint = false;
 private boolean showDpoint = false;
 private boolean showNose = false;
 private static int scount = 1;
 private static int dcount = 1;
 private static int ncount = 1;
 
 Paint paint;
 private String redText = "6";
 private static int rcount = 6;
 private String blueText = "1";
 private static int bcount = 1;
 
 public GameView(Context context,MainActivity activity) {
  super(context);
  this.activity = activity;
  InitBitmap();
 }
 


 @Override
 public void onDraw(Canvas canvas)
 {
  paint = new Paint();
  paint.setTextSize(35.0f);
  canvas.drawBitmap(bggame_image,0,0,null);
  if(showSpoint){
   canvas.drawBitmap(game_Spoint,32,124,null);   
  }
  if(showDpoint){
   canvas.drawBitmap(game_Dpoint,32,207,null);  
  }
  if(showNose){
   canvas.drawBitmap(game_Dpoint,88,329,null);
  }
  canvas.drawText(redText, 148, 152, paint);
  canvas.drawText(blueText, 148, 230, paint);
 }
 
 //加载图片
 private void InitBitmap()
 {
  bggame_image = BitmapFactory.decodeResource(this.getResources(), R.drawable.ernie);
  game_Spoint = BitmapFactory.decodeResource(this.getResources(), R.drawable.game_point);
  game_Dpoint = BitmapFactory.decodeResource(this.getResources(), R.drawable.game_point);
 }
 
 @Override
 public boolean onTouchEvent(MotionEvent event) 
 {
  int x=(int)event.getX();
  int y=(int)event.getY();
  
  if(event.getAction()!=MotionEvent.ACTION_DOWN)
   return super.onTouchEvent(event);
  
  //设置点击区域,可以用刷新界面来显示要加载的图片
  Rect rcSimpleChoice,rcDoulbeChoice,rcRegainGame,rcReturnSE,
  rcRedBig,rcRedSmall,rcBlueBig,rcBlueSmall,rcNose;
  
  rcSimpleChoice=new Rect(21,112,63,157);
  rcDoulbeChoice=new Rect(21,196,63,235);
  rcRegainGame=new Rect(148,424,189,445);
  rcReturnSE=new Rect(216,424,258,445);
  rcRedBig=new Rect(192,114,240,137);
  rcRedSmall=new Rect(189,142,236,168);
  rcBlueBig=new Rect(196,188,244,215);
  rcBlueSmall=new Rect(193,219,240,245);
  rcNose=new Rect(82,326,111,343);

  //点击男生的圆圈区域
  if(rcSimpleChoice.contains(x,y))
  {
   if(scount%2 == 1){
    showSpoint = true;      
   }
   else if(scount%2 == 0){
    showSpoint = false;   
   }
   scount ++; 
   //通过发送消息来刷新界面
            activity.mHandler.sendEmptyMessage(MainActivity.REFRESH);
   //invalidate();
  }
  
  //点击女生的圆圈区域
  if(rcDoulbeChoice.contains(x,y))
  {
   if(dcount%2 == 1){
    showDpoint = true;      
   }
   else if(dcount%2 == 0){
    showDpoint = false;   
   }
   dcount ++; 
//   activity.mHandler.sendEmptyMessage(MainActivity.REFRESH);
   //或者直接发送消息
   invalidate();
  }
  if(rcRegainGame.contains(x,y))
  {
   //点击返回键
   activity.mHandler.sendEmptyMessage(MainActivity.RETURN);
  }
  if(rcReturnSE.contains(x,y))
  {
   //点击重玩
   rcount = 6;
   bcount = 1;
   activity.mHandler.sendEmptyMessage(MainActivity.REGAIN);
  }
  //点击红球上箭头按钮
  if(rcRedBig.contains(x,y))
  {
   if(rcount<20){
    rcount ++ ;
    redText = String.valueOf(rcount);
    invalidate();   
   }
  }
  //点击红球下箭头按钮
  if(rcRedSmall.contains(x,y))
  {
   if(rcount>6){
    rcount -- ;
    redText = String.valueOf(rcount);
    invalidate();    
   }
  }
  //点击蓝球上箭头按钮
  if(rcBlueBig.contains(x,y))
  {
   if(bcount<16){
    bcount ++ ;
    blueText = String.valueOf(bcount);
    invalidate();   
   }
  }
  //点击蓝球下箭头按钮
  if(rcBlueSmall.contains(x,y))
  {
   if(bcount>1){
    bcount -- ;
    blueText = String.valueOf(bcount);
    invalidate();   
   }
  }
  //点击小人图片鼻子区域
  if(rcNose.contains(x,y))
  {
   if(ncount%2 == 1){
    showNose = true;      
   }
   else if(ncount%2 == 0){
    showNose = false;   
   }
   ncount ++; 
   //通过发送消息来刷新界面
            activity.mHandler.sendEmptyMessage(MainActivity.REFRESH);
   //invalidate();
  }
  
  return super.onTouchEvent(event);
 }
}



三、特别说明,有想要源码的可以留言,有问题的可以留言,有好的见解的也可以留言,互相讨论,共同进步;

转载请标明出处:http://blog.csdn.net/wdaming1986/article/details/6677729

 谢谢




热门内容

C# XmlSerializer 对象的Xml序列化和反序列化

    .Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使用;或者在... ...

hdu-1286找新朋友(欧拉函数,水题)

题目链接: 找新朋友 time limit: 2000/1000 ms (java/others)memory limi ...

java程序 处理 andrid本地帮助文档打开慢的方式

    下载本地的android自带sdk帮助文档由于有被墙的google地址,可以通... ...

RTTI学习笔记

翻看C++的书,对RTTI的讲解都很困惑,"你知道你的对象是哪个类吗","RTTI常用于调试和数据库程序"对这些讲... ...

使用axis2传输附件

服务端Service文件: import java.io.FileOutputStream; import jav... ...

sql server 的行转列

sql server中行转列在sql2005之后,sqlserver引入了pivot运算符,也即是可以旋转行为列,... ...
【Node.js基础篇】(九)使用readline模块实现Node.js的输入输出

【Node.js基础篇】(九)使用readline模块实现Node.js的输入输出

学C++的时候,有cout和cin,Java也有println和Scanner控件,Node.js也有如同... ...
iOS 应用支持4寸屏

iOS 应用支持4寸屏

iPhone 5出了,一大批应用要兼容新的分辨率,下载了Xcode 4.5,在官方那里找不到有关兼容新分辨... ...

循环执行oracle到mysql的迁移步骤及各种注意事项

改章节笔者在北京逛街的时候突然想到的...今天就有想写几篇关于循环执行的笔记,所以回家到之后就奋笔疾书的写出来发表了 ... ...
2015收获的季节

2015收获的季节

—————————————————————前言————————————————————— ———————... ...

JSP中的pageEncoding和contentType属性

关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是js... ...

对XX证券报关于物联网操作系统的几个问题的答复

XX证券报提问了几个关于物联网和物联网操作系统的问题,个人表达了一些粗陋的观点,在这里发表出来,与行业朋友交流和探... ...
In语句优化

In语句优化

In语句的优化 现有两张表: CLINIC_ORGANISM 数据量:1400 LAB_DRUGRESISTITE... ...
fuzzysearch, 在JavaScript中,快速而快速的模糊搜索

fuzzysearch, 在JavaScript中,快速而快速的模糊搜索

源代码名称:fuzzysearch源代码网址:http://www.github.com/bevacqua/fuzzys ...

SQL Server里的 ISNULL 与 NULLIF

SQL Server 中有两个参数,语法:     ISNULL(check_... ...

判断SD是否存在及其容量查询

这个非常简单,直接上代码: MainActivity: package com.home.getsdinf... ...

Python:如何排序(sort)

一、前言 python的列表(list)有两个排序方法: 一种是内建的list.sort()方法,可以直接改变列表的内容 ...

boost库在工作(5)作用域智能指针scoped_ptr之四

第二种情况,主要就是使用在调用异常抛出的函数的地方。如下面的例子: //异常抛出的函数,适合使用智能指针... ...

Error:couldnotopen`C:\ProgramFiles\Java\jre6\lib\i386\jvm.cfg'

昨天刚过情人节!哈哈,好久没记录学习内容了,今天在房子闲着没事重新安装jdk,按道理很简单的; 第一步下载jdk; ...

第49周二

晚上总结下今天,主要是在完善用户需求文档,同时看了jquery相关的操作技巧,主要是想学习jquery源码,在知乎jqu ...

C++ #include 和 using std::string

今天,偶尔写了一个小小的程序,关于字符串问题程序。 比如,我想连续打印用户输入的字符串。 #include&l... ...

Struts Hibernate Spring 经典面试题

Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Ses... ...

SAP Performance浅析

本文来源于:http://scnblogs.techweb.com.cn/tcsapbw/archives/106... ...

数据库MySQL与xls文件的互导

      最近的一个项目需要将xls表导入到MySQL数据库中和将MySQL数据表导出到... ...

Head-of-Line Blocking (线头阻塞)

Head of Line (HOL) Blocking 产生的原因: 概念:队列的首个packet由于它的目的... ...

Python set的高效利用

python set的应用   ... ...

CollectionFrameWork

collectionframework如下: collection ├list │├linkedlist │├array ...

JAVA访问修饰符构造函数的问题(转)

java访问修饰符 构造函数的问题 java访问修饰符-限定符总结(类比c#) java访问修饰符--------- ...

PAT甲1004CountingLeaves【dfs】

1004counting leaves(30 分) a family hierarchy is usually p ...

171.[LeetCode]Excel Sheet Column Number

题目: Related to question Excel Sheet Column Title ... ...