当前位置:  编程技术>移动开发
本页文章导读:
    ▪目无全牛FPPopover        庖丁解牛FPPopover FPPopover是一个实现Popover控件的开源项目,比标准控件要强大一些。虽然如此,但是在定制边框弹框时,还是遇到了问题:border=NO并且arrowDirection = FPPopoverNoArrow时多出了一个头.........
    ▪ winphone listbox 编者列表        winphone listbox 编辑列表 实现的功能: 点击 “编辑” 按钮,删除图标 “-”显示,”编辑“变为“取消”,“名称”字段向右移动适当距离;点击“-”实现删除 一行,刷新页面。 点击“取消.........
    ▪ fastboot移栽       fastboot移植转载请注明出处:http://blog.csdn.net/louiswangbing/article/details/12173911 fastboot是啥这里就不多说了,百度一下很多资料。 作为一个强大的刷机必备工具,我实在是不忍心不把它给分离出.........

[1]目无全牛FPPopover
    来源: 互联网  发布时间: 2014-02-18
庖丁解牛FPPopover

作者:ani_di
版权所有,转载务必保留此链接 http://blog.csdn.net/ani_di

庖丁解牛FPPopover

FPPopover是一个实现Popover控件的开源项目,比标准控件要强大一些。虽然如此,但是在定制边框弹框时,还是遇到了问题:border=NO并且arrowDirection = FPPopoverNoArrow时多出了一个头。














因此需要动手修改。好在这份源代码不长,修改代码的时候还可以欣赏一番。

ARCMacors.h

这个头文件定义了很多宏,基本上就是把支持arc的代码按照不支持arc的方式些,以便适应老版本。 很简单,不多说。这份头文件可以复用。

FPPopoverController

FPPopover主要就3个类,这个是Controller。里面主要由2个view:touchView和contentView。touchView和contentView分别用于事件捕获和内容展示。

init函数有两个-(id)initWithViewController:(UIViewController*)viewController,-(id)initWithViewController:(UIViewController*)viewController。其实主要工作在后一个里面。

-(id)initWithViewController:(UIViewController*)viewController

init里面主要是初始化_touchView和_contentView。_touchView的初始化总结为以下

_touchView = [[FPTouchView alloc] initWithFrame:self.view.bounds];
_touchView.backgroundColor = [UIColor clearColor];
_touchView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_touchView.clipsToBounds = NO;
[_touchView setTouchedOutsideBlock:^{
    [bself dismissPopoverAnimated:YES];
}];

Line 1构造FPTouchView,大小等于self.view.bounds。但这时self.view.bounds还没有大小,不过不要紧,后面setupView会重新修改。
Line 2、3设置背景色和自动调整时大小时的属性,这里是保持宽高不变。
Line 4设置不剪裁子view。默然是NO,此行意义不大。 Line 5设置点击到外面的事件,默认关闭view。touchView主要就是检测在view外和里面的touch事件。

_contentView也比较简单

self.contentSize = CGSizeMake(200, 300); //default size
_contentView = [[FPPopoverView alloc] initWithFrame:CGRectMake(0, 0, 
                                      self.contentSize.width, self.contentSize.height)];
[_contentView addContentView:_viewController.view];
_contentView.title = _viewController.title;

_contentView主要继承外部controller的title和view。在FPPopverView中,这两部分是独立开显示的。

-(void)setupView

setupView函数就是具体设置view的的大小。

self.view.frame = CGRectMake(0, 0, [self parentWidth], [self parentHeight]);
_touchView.frame = self.view.bounds;

touchView和self.view都等于parent bound。一般情况下,它的parent view是后面的AppDelegate的view,即全屏大小。后面可以看到,这样设置最后怎么区分touch inside和outside。

contentView的大小在-(CGRect)bestArrowDirectionAndFrameFromView:(UIView*)v设置,相对复杂一些。这里不深究计算方式。

setupView在很多地方都被调用过:在viewDidLoad、手动present、屏幕旋转、键盘显示等。虽然重复调用的次数比较多,但减轻了代码负担。

由于setupView调用的地方很多,必须调用setNeedsDisplay强制刷新,否则不会立即显示。

-(void)presentPopoverFromPoint:(CGPoint)fromPoint

这个函数主要的作用是设置_parentView。Line 7找到第一个window的第一个view,把自己的view加到里面。 根据事件的响应链window1->controller->views->window2...,self.view,即touchView会比现有的其他view更快响应。

[self.view removeFromSuperview];
NSArray *windows = [UIApplication sharedApplication].windows;
if(windows.count > 0)
{
    _parentView=nil;
    _window = [windows objectAtIndex:0];
    //keep the first subview
    if(_window.subviews.count > 0)
    {
        _parentView = [_window.subviews objectAtIndex:0];
        [_parentView addSubview:self.view];
        [_viewController viewDidAppear:YES];
    }

}

因为在init里面的bounds是0,因此没有真正显示出来。这里手动显示非常简单,设置好真实的frame即可。代码里还加了一点点小动画。

[self setupView];
self.view.alpha = 0.0;
[UIView animateWithDuration:0.2 animations:^{

    self.view.alpha = self.alpha;
}];
-(void)dismissPopover

要隐藏一个view方法很多,一般有两种方案:1. 设透明值;2. removeFromSuperview。 在这里用的方案2。这样可以排除self.view潜在的影响,效率方面也会提升一点。 另外有setupView,再次显示出来也不难。

FPTouchView

FPTouchView对象只有一个作用:判断点击操作的位置。

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *subview = [super hitTest:point withEvent:event];

    if(UIEventTypeTouches == event.type)
    {
        BOOL touchedInside = subview != self;
        if(!touchedInside)
        {
            for(UIView *s in self.subviews)
            {
                if(s == subview)
                {
                    //touched inside
                    touchedInside = YES;
                    break;
                }
            }            
        }

        if(touchedInside && _insideBlock)
        {
            _insideBlock();
        }
        else if(!touchedInside && _outsideBlock)
        {
            _outsideBlock();
        }
    }

    return subview;
}

最重要的是下面几段代码。

BOOL touchedInside = subview != self;
if(!touchedInside)
{
    for(UIView *s in self.subviews)
    {
        if(s == subview)
        {
            //touched inside
            touchedInside = YES;
            break;
        }
    }            
}

如果hitTest返回的是自身,则一定是在弹窗外部;如果不是,则判断是不是自己的子view。 在 FPPopoverController 的初始化方法里面,_contentView是 _touchView的子view。

基类的hitTest返回事件位于当前View最远的view(PS:这样才能让最后添加的view最先接收到事件), 如果没有这返回nil。 _touchView本身的frame等于第一个window的第一个view(参见 presentPopoverFromPoint), 一般这个view等于窗口大小。

作者这里代码很奇怪。判断子view的条件是 touchedInside == NO;而满足此条件则 subview == self。 那么检测self在self.subviews又是为何?

FPTouchedOutsideBlock & FPTouchedInsideBlock

这两个block是作者提供出来的回调。不同于以往的delegate模式,这里用的是block。
FPTouchedOutsideBlock在 FPPopoverController 用于关闭视图。所以修改这个时要注意一下。

FPPopoverView

这里面大部分代码都是用Quartz画外面的边框。计算orign稍微复杂一点,画tint的代码比较多。

回到以前

最开始的问题是在border=NO并且arrowDirection = FPPopoverNoArrow时多出了一个头。 不知道这是一个bug还是一个特性,反正不是我想要的需求。从上面的分析,解决这个问题应该从FPPopoverView的drawRect下手。

由于边框都是在drawRect中实现的,所以我的非常简单

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    if (self.border == NO && self.arrowDirection == FPPopoverNoArrow)
        return;
    // Keep others unchange
}

效果如下


 

    
[2] winphone listbox 编者列表
    来源: 互联网  发布时间: 2014-02-18
winphone listbox 编辑列表

实现的功能:
点击 “编辑” 按钮,删除图标 “-”显示,”编辑“变为“取消”,“名称”字段向右移动适当距离;点击“-”实现删除 一行,刷新页面。
点击“取消”,删除图标 “-”隐藏,”取消“变为“”编辑,“名称”字段向左移动适当距离。
相关图片:
设计:(下方红色框为 删除图标 “-”区域,“113”为“名称”字段区域)
正常状态:
编辑状态:
一、前台页面:
页面要引用:   xmlns: c4fToolkit ="clr-namespace:Coding4Fun.Phone.Controls;assembly=Coding4Fun.Phone.Controls"
    xmlns: c4fToolkitBinding="clr-namespace:Coding4Fun.Phone.Controls.Binding;assembly=Coding4Fun.Phone.Controls"
“编辑” 按钮:
                     < c4fToolkit: Tile    Grid.Column ="2"   Width ="0" Height="70" Title ="编辑" x : Name="editTxt" Click="Edit_Click" >
                        < Image Name ="editImg" Source="/images/edit.png" Stretch ="None" Margin ="-72,0,-54,0"   />
                    </ c4fToolkit: Tile >
删除图标 “-”:                 < local: DeleteListBox Grid.Column="0" Visibility ="Collapsed" Name ="lb0"ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility ="Disabled" Margin="0,0,0,0">
                        < local: DeleteListBox.ItemTemplate >
                            < DataTemplate>
                                < Grid>
                                    < Grid.RowDefinitions>
                                        < RowDefinition Height ="40" />
                                    </ Grid.RowDefinitions>
                                    < Grid.ColumnDefinitions>
                                        < ColumnDefinition Width ="37"/>
                                    </ Grid.ColumnDefinitions>
                                    < Image Source ="/images/delete.png" Margin="10,0,0,0" Height ="20" Width ="40" />
                                </ Grid>
                            </ DataTemplate>
                            </ local: DeleteListBox.ItemTemplate >
                    </ local: DeleteListBox >

二、后台:

加载页面时给lb0,lb1赋值,Quote 列表实体类
                     ObservableCollection <Quote > quotes = new ObservableCollection< Quote >();
                    ObservableCollection <Quote > qs = (ObservableCollection < Quote>) JsonConvert .DeserializeObject(reader.ReadToEnd(),typeof (ObservableCollection < Quote>));
                   //lb0删除图标,lb1名称字段
                    lb1.Dispatcher.BeginInvoke(() => { lb1.ItemsSource = quotes; });
                    lb0.Dispatcher.BeginInvoke(() => { lb0.ItemsSource = quotes; });


        /// <summary>
        /// 编辑,取消 事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Edit_Click( object sender, RoutedEventArgs e)
        {
            //lb0删除图标,lb1名称字段
            if (editTxt.Title == "编辑" )
            {
                //删除图标 “-”,“名称”字段向左右移动适当位置
                lb1.Margin = new Thickness (6, 0, 0, 0);
                lb0.Margin = new Thickness (0, 0, 0, -6);
                //删除图标 “-”显示
                lb0.Visibility = Visibility .Visible;
                editTxt.Title = "取消" ;
                //按钮“编辑”变“取消”
                editImg.Source = new BitmapImage ( new Uri( "/Images//cancel.png", UriKind .Relative));
            }
            else
            {
                lb1.Width = 150;
                //删除图标 “-”,“名称”字段向左右移动适当位置
                lb1.Margin = new Thickness (-36, 0, 0, 0);
                lb0.Margin = new Thickness (0, 0, 0, 36);
                //删除图标 “-”显示
                lb0.Visibility = Visibility .Collapsed;
                editTxt.Title = "编辑" ;
                //按钮“取消”变“编辑”
                editImg.Source = new BitmapImage ( new Uri( "/Images//edit.png", UriKind .Relative));
            }
        }


        /// <summary>
        /// 在此页将要在 Frame 中显示时进行调用。
        /// </summary>
        /// <param name="e"> 描述如何访问此页的事件数据。
        /// 属性通常用于配置页。 </param>
        protected override void OnNavigatedTo( NavigationEventArgs e)
        {
            base .OnNavigatedTo(e);
            try
            {
                if (NavigationContext.QueryString.Count > 0)
                {
                    string m = NavigationContext.QueryString[ "m"];
                    //删除一行页面刷新后仍然处于编辑状态
                    if (m == "edit" )
                    {
                        //lb0删除图标,lb1名称字段。删除图标 “-”,“名称”字段向左右移动适当位置
                        lb1.Margin = new Thickness (6, 0, 0, 0);
                        lb0.Margin = new Thickness (0, 0, 0, -6);
                        //删除图标 “-”显示
                        lb0.Visibility = Visibility .Visible;
                        editTxt.Title = "取消" ;
                        //按钮“编辑”变“取消”
                        editImg.Source = new BitmapImage ( new Uri( "/Images//cancel.png", UriKind .Relative));
                    }

                }
            }
            catch (Exception ex)
            {

            }
        }

 ListBox删除实体类:
   public class DeleteListBox : ListBox
    {
        public static App. GlableInfo appInfo = new App . GlableInfo();
        protected override void PrepareContainerForItemOverride( DependencyObject element, object item)
        {
            base .PrepareContainerForItemOverride(element, item);
            //ListBox列表行的Index
            int index = ItemContainerGenerator.IndexFromContainer(element);
            ListBoxItem li = element as ListBoxItem;
            //给ListBox列表每行名称赋值
            li.Name = (item as Quote ).Code + "|" + (item as Quote ).Name + "|" + (item as Quote ).TypeCode;
            //给ListBox列表按奇、偶行赋背景颜色,奇数行背景色为TransParent,偶数行为#101010
            li.Background = index % 2 == 0 ? null : Utility .GetColorFromHexa( "#101010", 255);
            //声明ListBox列表每行的点击事件
            li.Tap += new EventHandler <System.Windows.Input. GestureEventArgs>(EventHandler);
        }


        public void EventHandler( object sender, System.Windows.Input. GestureEventArgs e)
        {
            //取ListBox列表每行名称
            string [] param = (sender as ListBoxItem).Name.Split( '|' );
            string currentCode = param[0].Replace(" " , "+");
            string currentName = param[1].Replace(" " , "+");
            string currentType = param[2];
            string strMsg = string .Format( "您确认要将 {0} 从我的自选中删除吗?" , currentName);
            //弹出框选择是否删除此行
            MessageBoxResult mbr = MessageBox .Show(strMsg, appInfo.AppName, MessageBoxButton .OKCancel);
            if (mbr == MessageBoxResult .OK)
            {
                //SQLite数据库中删除此行
                SQLiteHelper .insertDelData(currentCode, currentType);
                //刷新页面,给时间参数避免页面缓存不刷新
                ( Application .Current.RootVisual as PhoneApplicationFrame).Navigate( new Uri ("/diyPage.xaml?m=edit&dt=" +DateTime.Now.ToString(), UriKind .Relative));
            }
        }
    }

    
[3] fastboot移栽
    来源: 互联网  发布时间: 2014-02-18
fastboot移植

转载请注明出处:http://blog.csdn.net/louiswangbing/article/details/12173911


fastboot是啥这里就不多说了,百度一下很多资料。

作为一个强大的刷机必备工具,我实在是不忍心不把它给分离出以便单独编译或者交叉编译给arm-linux。

有兴趣的可以一起研究一下:

https://github.com/louiskoo/fastboot-separated_from_android_4.2


    
最新技术文章:
▪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)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


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

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

浙ICP备11055608号-3