`

TableRow数据更新时加上高亮背景

阅读更多
    一般Table的数据(行)更新时,要配合一定的动画效果,才能引起用户注意。
    在Android里,颜色值用8位的16进制来表示,其中前两2位用来表示 alpha channel, 后6位用来表示rgb. 在程序里面,只要在指定时间内,将alpha channel从 0调整到 0xff,就实现了 highlight TableRow.


  • 下面是用线程来实现:


class ColorRefreshTask extends TimerTask {
			final static int  DELAY_ONCE =200;
			final static int TOTAL_RUNTIME = 3000;
			final static int POWER_16_16 = 16 * 16* 16 * 16 * 16 * 16;
			final static int INCREASE_ONCE =  0xff / (TOTAL_RUNTIME / DELAY_ONCE);
			int color;
			int id;
			int startTime;
			int alphaChannel;
			
			/**
			 * 
			 * @param color (TableRow's current background color)
			 * @param id TableRow's id(user id)
			 */
			public ColorRefreshTask(int color, int id) {
				super();
				Log.d("color", "ready to set color!");
				this.color = color;
				this.id = id;
				this.startTime = 0;
				this.alphaChannel = 0;
			}
			
			public void run(){
				
				int colorComm = color -0xff000000;  //RGB color value;
				int currColor = color;
				
				if(startTime < TOTAL_RUNTIME) {
						startTime +=  DELAY_ONCE;
						alphaChannel +=  INCREASE_ONCE;
						currColor = POWER_16_16 *  alphaChannel  + colorComm;
						Log.d("color", Integer.toHexString(currColor));
						sendMsg(currColor);
						messageHandler.postDelayed(this,DELAY_ONCE);
						
				}
				else {
					sendMsg(currColor);
				}
				
			
			}
			
			public void startTimer(){
				  messageHandler.postDelayed(this,DELAY_ONCE);
			}
			
			
			private void sendMsg(int currColor){
				Message message = messageHandler.obtainMessage(); 
				message.what = MESSAGE_HANDLE_ID_UPDATEROW_BACKGROUND;
				Bundle bundle = new Bundle();
				bundle.putInt(MESSAGE_KEY_ID, id);
				bundle.putInt(MESSAGE_KEY_COLOR, currColor);
				message.setData(bundle);
				messageHandler.sendMessage(message);
			}
			
			public void stopTimer(){
				  this.cancel();
			}
			
			
	  }


  • 消息处理部分:

 private static final int MESSAGE_HANDLE_ID = 800;
	  private static final int MESSAGE_HANDLE_ID_UPDATEROW_DATA = MESSAGE_HANDLE_ID + 1;
	  private static final int MESSAGE_HANDLE_ID_UPDATEROW_BACKGROUND = MESSAGE_HANDLE_ID +2;
	  private  Handler messageHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			
		switch(msg.what) {
			case  MESSAGE_HANDLE_ID_UPDATEROW_DATA:{
				int id = msg.getData().getInt(MESSAGE_KEY_ID);
				String fields[] = new String[5];
				fields[0] = msg.getData().getString("fields1");
				fields[1] = msg.getData().getString("fields2");
				fields[2] = msg.getData().getString("fields3");
				fields[3] = msg.getData().getString("fields4");
				fields[4] = msg.getData().getString("fields5");
				updateRowInTable(id, fields);
				break;
			}
						
			case  MESSAGE_HANDLE_ID_UPDATEROW_BACKGROUND:
			{
				int id = msg.getData().getInt(MESSAGE_KEY_ID);
				int color = msg.getData().getInt(MESSAGE_KEY_COLOR);
				TableRow tableRow= (TableRow)findViewById( id);
				if(tableRow != null) {
					int count = tableRow.getChildCount();
					for(int index = 0; index < count; index++) {
						TextView child = (TextView)(tableRow.getChildAt(index));
						if(child != null) {
							child.setBackgroundColor(color);
							
						}
					}
				}
				break;
			}
			default:
					
		}
			
		}
		  
	  };


  • 数据更新(其他线程会调用)部分:

private final void updateRowInTable(int code,String[] otherFields) {
	  TableRow tableRow= (TableRow)findViewById(code);
	  if(tableRow == null)  {
		  Log.d("tablerow", "can't find row in the table!");
		  return;
	  }
	  int bgColorEnd = (otherFields[2].indexOf("-") >= 0)  ?  0xff2e8b57 : 0xffb22222;
      for(int index = 0; index < otherFields.length; index++) {
    	   int identity = code * 13  +(index+1);
    	  
    	  TextView textView=  (findViewById(identity)!= null)  ?  (TextView) findViewById(identity) :  new TextView(this);  
    	 
    	  if(otherFields[index].indexOf('-') >=0) {
    		  textView.setTextColor(Color.GREEN);
    	  }
    	  else if( index == 2) {
    		  textView.setTextColor(Color.RED);
    	  }
    	  else  {
    		  textView.setTextColor(Color.WHITE);
    	  }
    	  textView.setText(otherFields[index]);
    	  Log.d("tablerow", "updated  id:" + (code)  + ", value="  + otherFields[index] );
    	  if(findViewById(identity) == null){
    		  textView.setId(identity);
    		  tableRow.addView(textView);  
    	  	  Log.d("tablerow", "add new view!");
    	  }
    	  else {
    		  Log.d("tablerow", "upate view!");
    	  }
    	  textView.postInvalidate();
    	  //textView.invalidate();
      }
      tableRow.postInvalidate();
      //tableRow.invalidate();
      ColorRefreshTask refresh = new ColorRefreshTask(bgColorEnd,code);
      messageHandler.postDelayed(refresh, 50);  
      
}


1
3
分享到:
评论

相关推荐

    Android 点按钮添加TableRow源码-IT计算机-毕业设计.zip

    在Android应用开发中,"Android 点按钮添加TableRow源码"是一个常见的实践,尤其是在构建用户界面(UI)时。此项目可能是一个简单的示例,旨在帮助毕业生理解和掌握Android编程的基本概念,同时也为撰写毕业论文提供...

    android 点按钮添加TableRow

    在Android开发中,`Button`和`TableRow`是两种非常常见的UI组件,它们分别用于创建交互式的按钮和呈现行布局的数据。在这个特定的场景中,`Add Button`可能是一个示例项目,它演示了如何在`TableRow`中动态添加`...

    Android 点按钮添加TableRow源码.zip

    这个压缩包提供的源码可能包含了一个简单的示例,展示了如何在用户点击按钮时动态地在界面上添加新的TableRow。 首先,我们来了解下TableRow的基本概念。TableRow继承自LinearLayout,用于水平方向排列其子视图,...

    安卓Android源码——点按钮添加TableRow源码.zip

    `TableRow`是Android中的一个视图,通常用于创建表格布局,它是`TableLayout`的一个子类,适用于在界面上展示行列数据。 首先,让我们了解`TableRow`的基本用法。`TableRow`就像HTML中的`&lt;tr&gt;`标签,它允许你在一个...

    Android代码-点按钮添加TableRow源码.zip

    当用户点击一个按钮时,程序会通过代码动态地创建一个新的TableRow,并将其添加到TableLayout中,这样的功能在需要动态生成数据表的应用中非常常见。 首先,我们需要理解Android的布局系统。Android应用的用户界面...

    Android 点按钮添加TableRow源码.zip项目安卓应用源码下载

    Android 点按钮添加TableRow源码.zip项目安卓应用源码下载Android 点按钮添加TableRow源码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    Android 点按钮添加TableRow源码.rar

    4. **TableRow的创建与配置**:创建一个新的TableRow对象,然后根据需求设置属性,如宽度、高度、背景色等。接着,向TableRow添加子视图,比如TextView或ImageView。 5. **TableLayout的管理**:在添加了新的Table...

    Android点按钮添加TableRow源码.zip

    在Android开发中,"点按钮"通常指的是可以响应用户点击事件的UI元素,而`TableRow`是用于构建表格布局的一种视图。这个压缩包“Android点按钮添加TableRow源码.zip”很可能包含了一个示例项目,演示如何在Android...

    Element Table的row-class-name无效与动态高亮显示选中行背景色

    在使用Element UI的Table组件时,如果直接使用row-class-name属性并按官方文档示例代码写入,可能会遇到无法实现高亮显示预想中的行的情况。例如,当你尝试让第一行高亮时,可能会发现并没有生效,控制台输出的行...

    Android源码——点按钮添加TableRow源码_new_57.zip

    在Android开发中,掌握如何动态地在用户界面上添加元素是一项重要的技能,特别是当涉及到表格布局(TableView)或其在Android中的实现,TableRow时。"Android源码——点按钮添加TableRow源码_new_57.zip"这个压缩包...

    Android程序研发源码Android 点按钮添加TableRow源码.rar

    在Android程序开发中,"Android程序研发源码Android 点按钮添加TableRow源码"这个主题主要涉及到了Android UI设计和事件处理方面的知识。在Android应用中,用户界面(UI)是与用户交互的关键部分,而表格布局(Table...

    Android源码——点按钮添加TableRow源码_new_57.7z

    动态添加`TableRow`的方法在实际应用中非常常见,比如在创建数据表、动态生成问卷或者用户输入表格数据时。这种灵活的布局方式使得开发者可以根据用户的行为或应用程序的需求动态调整界面。 7. **学习与调试** ...

    界面布局之表格布局TableLayout+TableRow(代码)

    在运行时,可以通过Java代码动态创建并添加TableRow到TableLayout。例如,可以创建一个循环来生成指定数量的行和列。 5. 注意事项: - 表格布局不适用于大量数据展示,因为性能问题,推荐使用RecyclerView或...

    Table TableRow TableCell与Bom模

    Table TableRow TableCell与Bom模型 与事件处理机制 与js 面向对象的基础;

Global site tag (gtag.js) - Google Analytics