由于项目需要,需要对图表中的label设置点击事件,可是google给的包没有实现这功能。看来得靠自己了!
慢慢看源码吧~
- 关于AChartEnging的事件,使用这个组件时大致有一下几个设置:
renderer.setPanEnabled(true, false);//表盘移动 renderer.setPanEnabled(true, false);//表盘缩放 renderer.setClickEnabled(true);//是否可点击 renderer.setSelectableBuffer(20);//点击区域大小
用起来是很方便的,但在源码中实现还是比较复杂的,特别是移动和缩放功能,先暂不讨论。
下面是在XYChart中点击某个点,触发事件的使用方法:
class ChartViewClick implements View.OnClickListener { @Override public void onClick(View v) { GraphicalView graphicalView = (GraphicalView) v; //获取当前点击点 SeriesSelection seriesSelection = graphicalView.getCurrentSeriesAndPoint(); if (seriesSelection == null) { return; } int x = (int) seriesSelection.getXValue(); Toast.makeText(context, "第几个点" + x, Toast.LENGTH_SHORT).show(); } }
public SeriesSelection getCurrentSeriesAndPoint() { return mChart.getSeriesAndPointForScreenCoordinate(new Point(oldX, oldY)); }
oldx,oldy应该就是触控事件中获取的
@Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // save the x and y so they can be used in the click and long press // listeners oldX = event.getX(); oldY = event.getY(); } if (mRenderer != null && (mRenderer.isPanEnabled() || mRenderer.isZoomEnabled())) { if (mTouchHandler.handleTouch(event)) { return true; } } return super.onTouchEvent(event); }
查看源码,发现getCurrentSeriesAndPoint()在抽象类AbstractChart.java中,XYChart重写了:
public SeriesSelection getSeriesAndPointForScreenCoordinate(final Point screenPoint) { if (clickableAreas != null) for (int seriesIndex = clickableAreas.size() - 1; seriesIndex >= 0; seriesIndex--) { // series 0 is drawn first. Then series 1 is drawn on top, and series 2 // on top of that. // we want to know what the user clicked on, so traverse them in the // order they appear on the screen. int pointIndex = 0; if (clickableAreas.get(seriesIndex) != null) { RectF rectangle; for (ClickableArea area : clickableAreas.get(seriesIndex)) { rectangle = area.getRect(); if (rectangle != null && rectangle.contains(screenPoint.getX(), screenPoint.getY())) { return new SeriesSelection(seriesIndex, pointIndex, area.getX(), area.getY()); } pointIndex++; } } } return super.getSeriesAndPointForScreenCoordinate(screenPoint); }
看来,关键在于clickableAreas的构造了。这在XYChart的onDraw方法中,差不多有100行
... clickableAreas = new HashMap<Integer, List<ClickableArea>>(); //sLength = series.size();遍历几条线 for (int i = 0; i < sLength; i++) { ... //遍历线中的每个点 for (Entry<Double, Double> value : range.entrySet()) { ... values.add(value.getKey()); values.add(value.getValue()); //把坐标值转换成屏幕中像素坐标 if (!isNullValue(yValue)) { points.add((float) (left + xPixelsPerUnit[scale] * (xValue - minX[scale]))); points.add((float) (bottom - yPixelsPerUnit[scale] * (yValue - minY[scale]))); ... //关键的来了,生成点击区域 ClickableArea[] clickableAreasForSubSeries = clickableAreasForPoints( MathHelper.getFloats(points), MathHelper.getDoubles(values), yAxisValue, i, startIndex); ... } clickableAreas.put(i, clickableArea); //clickableAreas是一个域,保存所有可点击系列 } }
查看上面clickableAreasForPoints方法,发现其实就是在坐标像素点处建一个变长为render.getSelectableBuffer()的矩形。
由此很容易想到:
- 在x轴标签处创建相应的可点击矩形,添加到clickableAreas中即可
这样解决的方法就有很多了,比较简单的方法就是在y轴最小值下面添加一项。。。。。(由于我的图标不用提供缩放和移动,并且最小值固定为0),只要 vYalues = -5d,添加一项即可。
像我一样记不住iOS应用图标像素尺寸的开发者不在少数,我经常需要查询不同设备上的应用尺寸,为了方便自己、方便大家,我制作了下面的图表供大家参考。
iPhone、iPodTouch以及一般通用的应用图标像素尺寸是多少?
iPhone和iPodTouch应用需要一般应用所有的图标像素,你可能会想知道为什么iPhone应用需要iPad应用图标,因为一款iPhone应用也可以在iPad上运行。
相反,iPad应用不能在iPhone上运行,因此iPad应用有专属自己的图标像素。
必需图标:
AppStore图标:1024×1024pixels
iPhone主屏幕图标:57×57、114×114(retina)pixels
iPad主屏幕图标:72×72、144×144(retina)pixels
可选图标:
iPhone、iPadSettings、iPhoneSpotlightsearchresults:29×29、58×58(retina)pixels
iPadSpotlightsearchresults:50×50、100×100(retina)pixels
iPad应用需要什么样的图标。
由于只适用iPad的应用不能再iPhone上运行,因此你不需要那么多图标。
所需图标:
AppStore图标:1024×1024pixels
iPad主屏幕图标:72×72、144×144(retina)pixels
可选图标:
iPadSettings:29×29and58×58(retina)pixels
iPadSpotlightsearchresults:50×50and100×100(retina)pixels
文章原文出处:http://www.cocoachina.com/appstore/top/2012/1105/5031.html
config 种选中powver manager 里面的内容
修改 一个config
vi arch/arm/plat-samsung/Makefile
注释 #obj-$(CONFIG_SAMSUNG_DEV_ADC) += dev-adc.o
增加 MACHINE_START 里面增加一段
fixup 的代码。主要是初始化变量。pm_debug_scratchpad = ram_console_start + ram_console_size;
smdkv210.c 增加了 两个 include 文件,和一个函数
#include <mach/gpio.h>
#include <mach/gpio-herring.h>
s3c_setup_uart_cfg_gpio(unsigned char port)
-------------------------------------------------------
至此能编译成功,并有打印信息。
以上基于samsung android 2.6.35 的内核,只是编译成功,但是开发板上运行是异常的。
另外发现了一处 samsung 的内核,在 www.kernel.org 官方网站上找到的。
git 地址:git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung.git
使用的分支 是 v3.5-next/cleanup-plat-s5p
这是一个3.4的内核,编译的配置使用s5pv210_defconfig.
make ARCH=arm s5pv210_defconfig
make -j2 uImage ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
能够正常的编译通过,只是修改了 配置文件种串口的端口就可以了,但是启动之后,不能挂载 root ,总是报错,目前不清楚是什么错。但是比以前进步了许多的。
终于差清楚了问题,问题出在了 arch/arm/mach-s5pv210/Makefile.boot 的文件,这个文件种写了两个地址,一个是内核启动地址,一个是uboot参数的写入地址,uboot将参数写如了 30000100 的地址,而默认的地址是20000100,所以读取不到启动参数,只要修改了这个,就可以了,内核的加载地址也放在了30008000的地址,就可以正常读取uboot的参数了,可以正常启动文件系统了。
总结:
不抛弃不放弃,慢慢做,一定能成功的。
在挂载Android ramdisk 时要挂载很多驱动,否则启动不正常。
手下是按照出厂所代的哪个CONFIG ,配置了网络支持,network support ,结果就不再报错Address Family not support 的支持了。
但是出现了MTD 信息不能挂载的错误。主要是Nand 上的文件没有读取出来。现在追查是drivers mtd nand 的配置有错误,都配置了,但是发现少了一些选项,追查文件,是没有添加PCI 的支持,也就是在arch/arm/Kconfig 种的文件 没其作用,这个文件种配置了 CONFIG PCI ,但是到了drivers/mtd/nand/Kconfig 却没有解析到PCI 这个东西,导致一些配置不其作用。明天继续追查如何让CONFIG PCI 起作用。
经过验证,和CONFIG_PCI 没有什么关系,不用关心它
添加Nand驱动的支持,不是个简单的事情。
移植Nand 的驱动,首先要移植 drivers/mtd/nand/下面的文件,也就是platform-driver ,其次还要添加platform_device ,也就是生命结构体,而且结构提声明种的name 应该完全一样,否则不能启动。
具体的可以参照:http://blog.csdn.net/f22jay/article/details/7856598
写的很详细,而且是针对S5PV210的,用途很大。
现在遇到的问题是nand 的时钟不对。
解决了Clock的问题了。
虽然不清楚原理,但是其实质就是在arch/arm/mach-s5pv210/clock.c 的init_clock_off 的数组里面添加Nand的相关选项。注意不要加.dev的相关选项,编译不能通过,只有道行高了,再去结构化他把。
注意:s3c_nand.c 里面clk_get(xxx,"nand"),要和clock.c 文件里面定义的 name 一致,也就是nand
这样,Nand 就能正常启动了,但是yaffs2 解压完成之后。又有了新的BUG
BUG: sleeping function called from invalid context at include/linux/freezer.h
不清楚什么原因,睡觉了
和上次相比,没有太大的进展,只是把 Nand 的驱动,移植到了 3.0.8 上面,能够正常启动,也能运行系统,但是 系统一启动就要输入密码,不清楚什么情况。
明天移植LCD 的驱动,不能启动Android ,也可以启动个别的系统玩
LCD 驱动没有移植成功,主要原因是一开是没有弄明白 framebuffer 和LCD 驱动之间的关系,framebuffer 是一个中间层,介于软件和硬件之间。
LCD 的驱动就是GPU 的驱动,它在 drivers/gpu/pvr 目录下,这个是qt210 所用的GPU 驱动,直接复制了过来,没有太大的移植难度。主要是参数配置有问题,导致了fb_size 太小,系统就不能启动了,中断了,估计把这个移植完成,就可以正常启动系统了。
参数调整之后,缓存分配不了,系统不能启动,DMA 的大小为14M ,但是framebuffer 就用掉了10M 左右,而且系统启动不起来,移植的内存分配错误
LCD 驱动移植,无限吐血中。。。。。。强烈怀疑Linux 这帮人怎么整的架构。