菜单

Android UI控件系列:GridView

2020年1月15日 - 金沙国际唯一官网
Android UI控件系列:GridView

GridView按照行列的方式来显示内容,一般适合显示图标、图片等内容,主要用于设置Adapter

先准备一张图片添加到Assets.xcassets中

图片 1

周末第二弹, 继续Core Animation的基础内容复习.

在这里主要是基础BaseAdapter类,重写其中的方法,主要是重写getView方法设置图片的显示格式

常规按钮上图片内容和文本内容的位置

图片 2

Layer对象是Core Animation中的核心概念. layer管理着app中的可视化内容,
并且为你提供了改变这些内容样式的选择. iOS app是自动支持layer的, OS
X的开发者们则需要手动去设置是否支持layer(默认是不支持的).
一旦开始支持layer,
那么你就需要理解如何配置和操作app中的各个layer以此来达到你想得到的效果.

实例代码如下

通过titleLabel.frame和imageView.frame来修改图片内容和文本内容的位置
- viewDidLoad { [super viewDidLoad]; UIButton *greenBt = [UIButton buttonWithType:UIButtonTypeCustom]; greenBt.frame = CGRectMake(0, 0, 150, 70); greenBt.center = CGPointMake(self.view.center.x, 200); greenBt.backgroundColor = [UIColor grayColor]; [greenBt setTitle:@"按钮二" forState:UIControlStateNormal]; [greenBt setImage:[UIImage imageNamed:@"icon"] forState:UIControlStateNormal]; greenBt.imageView.backgroundColor = [UIColor redColor]; greenBt.titleLabel.backgroundColor = [UIColor purpleColor]; // 改变位置 greenBt.titleLabel.frame = CGRectMake(0, 0, 100, 70); greenBt.imageView.frame = CGRectMake(100, 0, 70, 70); [self.view addSubview:greenBt];}

运行效果:

图片 3

注意:在按钮外面修改的尺寸,按钮的内部都会覆盖掉

App中支持Core Animation

在iOS app中, Core Animation是自动支持的,
并且每一个view都自带一个相对应的layer. 在OS X中, 想要使用Core
Animation则需要手动去设置, 步骤如下:

上面的任何一种方法都会创建一个基于layer的view.
之后系统会自动创建layer对象, 并且保持其更新.

GridViewTest.java

正确修改按钮图片内容和文本内容的位置的两种方法

创建一个MyButton的类继承UIButton

#pragma mark - 方法一/* 重新titleRectForContentRect: 和 imageRectForContentRect: 这两个方法修改文本内容位置和图片内容位置*/ // 修改文本内容位置- titleRectForContentRect:contentRect{ return CGRectMake(0, 0, 100, 70);} // 修改图片内容位置- imageRectForContentRect:contentRect{ return CGRectMake(100, 0, 70, 70);} 

#pragma mark - 方法二 - layoutSubviews{ [super layoutSubviews]; // 从新布局文本内容titleLabel self.titleLabel.frame = CGRectMake(0, 0, 100, 70); // 从新布局图片内容imageView self.imageView.frame = CGRectMake(100, 0, 70, 70); } 

在ViewController 使用

- viewDidLoad { [super viewDidLoad]; MyButton *greenBt = [MyButton buttonWithType:UIButtonTypeCustom]; greenBt.frame = CGRectMake(0, 0, 150, 70); greenBt.center = CGPointMake(self.view.center.x, 200); greenBt.backgroundColor = [UIColor grayColor]; [greenBt setTitle:@"按钮二" forState:UIControlStateNormal]; [greenBt setImage:[UIImage imageNamed:@"icon"] forState:UIControlStateNormal]; greenBt.imageView.backgroundColor = [UIColor redColor]; greenBt.titleLabel.backgroundColor = [UIColor purpleColor]; [self.view addSubview:greenBt]; }

运行效果:

图片 5

运行效果看起来有点丑

改变View对应的layer对象

默认情况下, 基于layer的view已经创建了一个CALayer类的实例,
并且在绝大多数情况下, 你可能并不需要改变已经创建好的这个layer实例对象.
然而, Core Animation是提供了不同的layer类供你选择的,
每种layer类都有自己特殊的能力, 如果你用的到,
你可能就会改变默认情况下创建出来的layer类.
选择不同的layer类可以让你以一种简单的方式提高内容的展示效果或是支持特定类型的内容展示.
比如CATiledLayer类就能够以一种更有效的方式来展示大图.

/*
* @author hualang
*/
package org.hualang.grid;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class GridViewTest extends Activity {
    /** Called when the activity is first created. */
        private GridView gv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //通过findViewById方法获得GridView对象
        gv=(GridView)findViewById(R.id.GridView01);
        //设置GridView的行数
        gv.setNumColumns(4);
        gv.setAdapter(new MyAdapter(this));
    }
    //自定义适配器
    class MyAdapter extends BaseAdapter
    {
            //图片id数组
            private Integer[] imgs={
                            R.drawable.img01,
                            R.drawable.img02,
                            R.drawable.img03,
                            R.drawable.img04,
                            R.drawable.img05,
                            R.drawable.img06,
                            R.drawable.img07,
                            R.drawable.img08,

                            R.drawable.img01,
                            R.drawable.img02,
                            R.drawable.img03,
                            R.drawable.img04,
                            R.drawable.img05,
                            R.drawable.img06,
                            R.drawable.img07,
                            R.drawable.img08
            };
            //上下文对象
            Context context;
            //构造方法
            MyAdapter(Context context)
            {
                    this.context=context;
            }
            //获得数量
            public int getCount()
            {
                    return imgs.length;
            }
            //获得当前选项
            public Object getItem(int item)
            {
                    return item;
            }
            //获得当前选项id
            public long getItemId(int id)
            {
                    return id;
            }

            //创建View方法
            public View getView(int position,View convertView,ViewGroup parent)
            {
                    ImageView imageView;
                    if(convertView==null)
                    {
                            //实例化ImageView对象
                            imageView=new ImageView(context);
                            //设置ImageView对象布局
                            imageView.setLayoutParams(new GridView.LayoutParams(45,45));
                            //设置边界对齐
                            imageView.setAdjustViewBounds(false);
                            //设置刻度类型
                            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                            //设置间距
                            imageView.setPadding(8,8,8,8);
                    }else
                    {
                            imageView=(ImageView)convertView;
                    }
                    //为ImageView设置图片资源
                    imageView.setImageResource(imgs[position]);
                    return imageView;
            }

    }
}
重写initWithFrame方法优化MyButton效果
- (instancetype)initWithFrame:frame{ self = [super initWithFrame:frame]; if (self != nil) { // 设置文本居中 self.titleLabel.textAlignment = NSTextAlignmentCenter; // 设置图片的内容模式 self.imageView.contentMode = UIViewContentModeCenter; } return self;}

运行效果:

图片 6

使用UIView来改变layer所属的类

你可以通过重写view的layerClass方法,
返回一个不同的类对象以此来改变layer的类型.
绝大数多iOS中的view都创建了CALayer对象, 并用其来存储自身的内容.
对于你自己创建的view来说, 默认的选择就够了, 你也不需要去修改它.
但是在某些特殊的情景下, 你可能会发现其他的layer类会更加适合当前的场景.
比如, 在以下场景下, 你可能就会想改变默认的layer类:

改变一个view的layer所属的类方法很直接, 代码如下.
只需要重写layerClass方法, 并且返回要替换的类就可以了. 在view展示之前,
首先就会调用layerClass方法, 使用该方法返回的类来创建layer对象,
一旦创建, layer对象就不能改变.

+ (Class)layerClass {
   return [CAMetalLayer class];
}

注: 想要查看有哪些layer类并且如何使用它们, 请看Different Layer
Classes Provide Specialized
Behaviors

main.xml

当同时使用重写titleRectForContentRect: 、 imageRectForContentRect: 方法和重写layoutSubviews方法时
#pragma mark - 方法一/* 重新titleRectForContentRect: 和 imageRectForContentRect: 这两个方法修改文本内容位置和图片内容位置*/// 修改文本内容位置- titleRectForContentRect:contentRect{ return CGRectMake(0, 0, 100, 70);}// 修改图片内容位置- imageRectForContentRect:contentRect{ return CGRectMake(100, 0, 70, 70);}#pragma mark - 方法二- layoutSubviews{ [super layoutSubviews]; // 从新布局文本内容titleLabel self.titleLabel.frame = CGRectMake(70, 0, 100, 70); // 从新布局图片内容imageView self.imageView.frame = CGRectMake(0, 0, 70, 70); }

运行效果:

图片 7

最终运行的效果显示,文本内容和图片内容的位置是按照layoutSubviews中设置的数据显示的,说明layoutSubviews是最后执行的方法。打印它们执行的顺序:

-[MyButton titleRectForContentRect:]-[MyButton imageRectForContentRect:]-[MyButton layoutSubviews]

对其他控件内容位置不满意也可以在layoutSubviews修改内容布局。

使用NSView来改变layer所属的类

通过重写NSView对象的makeBackingLayer方法也可以改变默认的layer对象所属的类.
在这个方法的实现中, 创建和返回你想要AppKit用来存储你view的layer对象.
当你想使用一个可定制的layer时可能就会重写这个方法.

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图