当前位置:  编程技术>移动开发
本页文章导读:
    ▪大寨之旅[一]山寨Funambol UI一点点        山寨之旅[一]山寨Funambol UI一点点 代码图片布局创意等等所有的一切都归原创者所有我已经分不清谁是原创如要用于商业,请遵守相关法则主要的代码就是SyncStatusPanel.java山寨的还不够干净.........
    ▪ 实现Activity下的控件双击事件        实现Activity上的控件双击事件 重写dispatchTouchEvent 方法 就好了  Java代码     //处理双击事件       @Override       public boolean dispatchTouchEvent(MotionEvent ev) {           if (ev.getActi.........
    ▪ 查看栈信息中 .so资料里地址对应的方法名称       查看栈信息中 .so文件里地址对应的方法名称 在Android开发中,涉及到JNI时,有时会报告非常底层栈信息,在栈信息中 仅仅给出了.so文件出错位置的地址,根本看不成问题所在,但是如果使用a.........

[1]大寨之旅[一]山寨Funambol UI一点点
    来源: 互联网  发布时间: 2014-02-18
山寨之旅[一]山寨Funambol UI一点点
代码图片布局创意等等所有的一切都归原创者所有
我已经分不清谁是原创
如要用于商业,请遵守相关法则

主要的代码就是SyncStatusPanel.java
山寨的还不够干净利落,有些代码可能无用
package org.xkit.android.demo;

import android.app.Activity;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

@SuppressWarnings("unused")
public class SyncStatusPanel extends RelativeLayout {
	private class SetIconUIThread implements Runnable {

		private int image;

		public SetIconUIThread() {
		}

		public void run() {
			if (image != 0) {
				sourceIconView.setImageResource(image);
			} else {
				sourceIconView.setImageResource(0);
			}
		}

		public void setIcon(int image) {
			this.image = image;
		}
	}

	private class SetStatusIconUIThread implements Runnable {
		private int image;

		public SetStatusIconUIThread() {
		}

		public void run() {
			if (image != 0) {
				statusIconView.setImageResource(image);
			} else {
				statusIconView.setImageResource(0);
			}
		}

		public void setIcon(int image) {
			this.image = image;
		}
	}

	private class SetStatusStringUIThread implements Runnable {
		private String text;

		public SetStatusStringUIThread() {
		}

		public void run() {
			statusTextView.setText(text);
		}

		public void setText(String value) {
			this.text = value;
		}
	}

	private class SetTitleUIThread implements Runnable {
		private String title;

		public SetTitleUIThread() {
		}

		public void run() {
			titleTextView.setText(title);
		}

		public void setTitle(String title) {
			this.title = title;
		}
	}

	protected static final int BOTTOM_PADDING = 8;

	private static final int DISABLED_TEXT_COLOR = 0xFF7F7F7F;

	private static final int ENABLED_TEXT_COLOR = 0xFF000000;

	protected static final int SOURCE_ICON_LEFT_PADDING = 4;

	protected static final int SOURCE_ICON_RIGHT_PADDING = 4;

	private static final int STATUS_FONT_SIZE = 12;
	protected static final int STATUS_ICON_R_PADDING = 4;

	protected static final int STATUS_L_PADDING = 12;
	private static final int TITLE_FONT_SIZE = 20;

	protected static final int TITLE_L_PADDING = 5;
	protected static final int TOP_PADDING = 8;

	protected Activity activity;

	protected SetIconUIThread setIconUIThread = new SetIconUIThread();
	protected SetStatusIconUIThread setStatusIconUIThread = new SetStatusIconUIThread();
	protected SetStatusStringUIThread setStatusStringUIThread = new SetStatusStringUIThread();
	protected SetTitleUIThread setTitleUIThread = new SetTitleUIThread();

	protected ImageView sourceIconView;
	protected ImageView statusIconView;
	protected TextView statusTextView;
	protected TextView titleTextView;

	// 每个元素的ID
	protected final int D1 = 0X514001, D2 = 0X514002, D3 = 0X514003,
			D4 = 0X514004;

	public SyncStatusPanel(Activity activity) {
		super(activity);
		this.activity = activity;
		statusIconView = createStatusIcon(activity);
		sourceIconView = createSourceIcon(activity);
		titleTextView = createTitleText(activity);
		statusTextView = createStatusText(activity);

		RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(
				LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT);
		params1.addRule(RelativeLayout.CENTER_VERTICAL);
		params1.addRule(RelativeLayout.ALIGN_PARENT_LEFT);

		addView(sourceIconView, params1);

		RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(
				LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT);

		params2.addRule(RelativeLayout.CENTER_VERTICAL);
		params2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

		addView(statusIconView, params2);

		RelativeLayout.LayoutParams params3 = new RelativeLayout.LayoutParams(
				LayoutParams.FILL_PARENT,
				LayoutParams.WRAP_CONTENT);
		params3
				.addRule(RelativeLayout.RIGHT_OF,
						sourceIconView.getId());
		params3.addRule(RelativeLayout.ALIGN_PARENT_TOP);
		params3.addRule(RelativeLayout.LEFT_OF, statusIconView.getId());
		addView(titleTextView, params3);

		RelativeLayout.LayoutParams params4 = new RelativeLayout.LayoutParams(
				LayoutParams.FILL_PARENT,
				LayoutParams.WRAP_CONTENT);
		params4
				.addRule(RelativeLayout.RIGHT_OF,
						sourceIconView.getId());
		params4.addRule(RelativeLayout.BELOW, titleTextView.getId());
		params4.addRule(RelativeLayout.LEFT_OF, statusIconView.getId());
		addView(statusTextView, params4);

		setBackgroundResource(R.drawable.sync_status_panel);
	}

	protected int adaptSizeToDensity(int size) {
		return (int) (size * getContext().getResources()
				.getDisplayMetrics().density);
	}

	protected ImageView createSourceIcon(Activity activity) {
		ImageView sourceIconView = new ImageView(activity);
		sourceIconView.setPadding(
				adaptSizeToDensity(SOURCE_ICON_LEFT_PADDING),
				adaptSizeToDensity(TOP_PADDING),
				adaptSizeToDensity(SOURCE_ICON_RIGHT_PADDING),
				adaptSizeToDensity(BOTTOM_PADDING));
		sourceIconView.setId(D1);
		return sourceIconView;
	}

	protected ImageView createStatusIcon(Activity activity) {
		ImageView statusIconView = new ImageView(activity);
		statusIconView.setAdjustViewBounds(true);
		statusIconView.setMaxHeight(adaptSizeToDensity(32));
		statusIconView.setMaxWidth(adaptSizeToDensity(32));
		statusIconView.setId(D2);
		return statusIconView;
	}

	protected TextView createStatusText(Activity activity) {
		TextView statusTextView = new TextView(activity);
		statusTextView.setPadding(adaptSizeToDensity(STATUS_L_PADDING),
				0, 0, 0);
		statusTextView.setTextSize(STATUS_FONT_SIZE);
		statusTextView.setTextColor(ENABLED_TEXT_COLOR);
		statusTextView.setBackgroundColor(android.R.color.black);
		statusTextView.setId(D3);
		return statusTextView;
	}

	protected TextView createTitleText(Activity activity) {
		TextView titleTextView = new TextView(activity);

		titleTextView.setTextSize(TITLE_FONT_SIZE);
		titleTextView.setPadding(adaptSizeToDensity(TITLE_L_PADDING),
				adaptSizeToDensity(TOP_PADDING), 0, 0);
		titleTextView.setTextColor(ENABLED_TEXT_COLOR); // COLOR

		titleTextView.setId(D4);
		return titleTextView;
	}

	public void setIcon(int image) {
		setIconUIThread.setIcon(image);
		activity.runOnUiThread(setIconUIThread);
	}

	public void setStatusIcon(int image) {
		setStatusIconUIThread.setIcon(image);
		activity.runOnUiThread(setStatusIconUIThread);
	}

	public void setStatusString(String value) {
		setStatusStringUIThread.setText(value);
		activity.runOnUiThread(setStatusStringUIThread);
	}

	public void setTitle(String value) {
		setTitleUIThread.setTitle(value);
		activity.runOnUiThread(setTitleUIThread);
	}
}

这个类代码很少,但是还是可以学到些基本知识

比如为什么要用Runnable来更新UI

adaptSizeToDensity方法的目的

用XML来定义背景图形

RelativeLayout基本知识

等等等等

调用方法如下:
		LinearLayout lll = (LinearLayout) findViewById(R.id.boxes);

		LinearLayout.LayoutParams ll1Params = new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT,
				LayoutParams.FILL_PARENT);

		SyncStatusPanel ssp = new SyncStatusPanel(this); // 这个是我们自定义的

		ssp.setIcon(R.drawable.icon_calendar);
		ssp.setTitle("日程安排");
		ssp.setStatusString("上次同步在 2010-01-01 12:23:32");
		ssp.setStatusIcon(R.drawable.icon_complete);

		lll.addView(ssp, ll1Params);


直接上图
山寨:


原图:
https://android-client.forge.funambol.org/


估计我这直接叫抄袭吧,姑且叫它学习

    
[2] 实现Activity下的控件双击事件
    来源: 互联网  发布时间: 2014-02-18
实现Activity上的控件双击事件

重写dispatchTouchEvent 方法 就好了 

Java代码 
  •    //处理双击事件  
  •     @Override  
  •     public boolean dispatchTouchEvent(MotionEvent ev) {  
  •         if (ev.getAction() == MotionEvent.ACTION_DOWN) {  
  •             count++;  
  •             if(count==1){  
  •                 firstClick = System.currentTimeMillis();  
  •             }else if(count==2){  
  •                 secondClick = System.currentTimeMillis();  
  •                 if (secondClick - firstClick < 500) {  
  •                     //事件响应 
  •                 }  
  •                 count = 0;  
  •                 firstClick = 0;  
  •                 secondClick = 0;  
  •             }  
  •         }  
  •   
  •         return super.dispatchTouchEvent(ev);  
  •     }  

  •     
    [3] 查看栈信息中 .so资料里地址对应的方法名称
        来源: 互联网  发布时间: 2014-02-18
    查看栈信息中 .so文件里地址对应的方法名称

    在Android开发中,涉及到JNI时,有时会报告非常底层栈信息,在栈信息中 仅仅给出了.so文件出错位置的地址,根本看不成问题所在,但是如果使用arm-eabi-addr2line 命令,就可以把地址信息转换成方法名称:

    arm-eabi-addr2line 命令 在%ANDROID_SOURCE%\prebuilt\linux-x86\toolchain\arm-eabi-4.4.0\bin;


    例如有如下的栈信息:

     

    02-21 13:34:39.621 I/DEBUG   (   79): pid: 394, tid: 560  >>> android.process.media <<<
    02-21 13:34:39.621 I/DEBUG   (   79): signal 11 (SIGSEGV), fault addr 4b98b000
    02-21 13:34:39.621 I/DEBUG   (   79):  r0 4b98a054  r1 00000000  r2 00000e94  r3 4b98b000
    02-21 13:34:39.621 I/DEBUG   (   79):  r4 00000000  r5 4b989f14  r6 9ea08104  r7 0029b0e5
    02-21 13:34:39.621 I/DEBUG   (   79):  r8 4b98a564  r9 43ddfc68  10 43ddfc50  fp 00290840
    02-21 13:34:39.621 I/DEBUG   (   79):  ip 9ea0816c  sp 4b9898c8  lr 9ea05393  pc afd1cde6  cpsr 20000030
    02-21 13:34:39.621 I/DEBUG   (   79):  d0  0000004442880000  d1  3ff0000042880000
    02-21 13:34:39.621 I/DEBUG   (   79):  d2  bfd3441350baf6de  d3  c1493000c1323800
    02-21 13:34:39.621 I/DEBUG   (   79):  d4  4900000040dcb000  d5  000000000006e580
    02-21 13:34:39.621 I/DEBUG   (   79):  d6  4515a00000000800  d7  40800000c48ee000
    02-21 13:34:39.621 I/DEBUG   (   79):  d8  0000000000000000  d9  0000000000000000
    02-21 13:34:39.621 I/DEBUG   (   79):  d10 0000000000000000  d11 0000000000000000
    02-21 13:34:39.621 I/DEBUG   (   79):  d12 0000000000000000  d13 0000000000000000
    02-21 13:34:39.621 I/DEBUG   (   79):  d14 0000000000000000  d15 0000000000000000
    02-21 13:34:39.621 I/DEBUG   (   79):  scr 80000012
    02-21 13:34:39.621 I/DEBUG   (   79):
    02-21 13:34:39.661 I/DEBUG   (   79):          #00  pc 0001cde6  /system/lib/libc.so
    02-21 13:34:39.661 I/DEBUG   (   79):          #01  pc 00005390  /system/lib/libdrm1.so
    02-21 13:34:39.661 I/DEBUG   (   79):          #02  pc 0000321c  /system/lib/libdrm1.so
    02-21 13:34:39.661 I/DEBUG   (   79):
    02-21 13:34:39.661 I/DEBUG   (   79): code around pc:
    02-21 13:34:39.661 I/DEBUG   (   79): afd1cdc4 429a3301 2000d1f4 46c0bd30 2a00b510

     

    则执行以下命令:

    arm-eabi-addr2line -f -e %ANDROID_SOURCE%/out/target/product/xxxxx/system/lib/libdrm1.so 00005390


    返回结果就是该地址对应的方法名称。


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    WEB前端 iis7站长之家
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3