crossApp初级-CAScale9ImageView类-8

CAScale9ImageView

类的继承关系:

CAScale9ImageView : public CAView,继承CAView类,视图类,它的对象可以显示到屏幕,定义对象主要使用CAIamge类对象的图片纹理来创建图片对象。

   一.  CAScale9ImageView是CrossApp提供的一种九宫格拉伸图片的解决方案,我们先来了解一下什么三九宫格图片拉伸。 在App的设计过程中,为了适配不同的手机分辨率,图片大小需要拉伸或者压缩,这样就出现了可以任意调整大小的拉伸样式。

CAScale9ImageView的实现非常巧妙,通过将原纹理资源切割成9部分(PS: 这也是叫九宫图的原因),根据想要的尺寸,完成以下的三个步骤:
    (1)保持4个角部分不变形
    (2)单向拉伸4条边(即在4个角两两之间的边,比如上边,只做横向拉伸)
    (3)双向拉伸中间部分(即九宫图的中间部分,横向,纵向同时拉伸,PS:拉伸比例不一定相同)


二.实例1

void FirstViewController::viewDidLoad()
{
	CAImage* caimg = CAImage::create("r/btn_rounded_normal.png");
	
	//原始大小
	CAImageView* caimgview1 = CAImageView::createWithImage(caimg);
	caimgview1->setFrame(CCRect(100, 100, caimg->getContentSize().width,caimg->getContentSize().height));
	//
	//拉伸之后显示
	CAImageView* caimgview2 = CAImageView::createWithImage(caimg);
	caimgview2->setFrame(CCRect(100, 200, caimg->getContentSize().width*3, caimg->getContentSize().height*2));

	//使用scale9imageview 来拉伸
	CAScale9ImageView* cascale9image1 = CAScale9ImageView::createWithImage(caimg);
	cascale9image1->setFrame(CCRect(100, 300, caimg->getContentSize().width * 3, caimg->getContentSize().height * 2));


	this->getView()->addSubview(caimgview1);
	this->getView()->addSubview(caimgview2);
	this->getView()->addSubview(cascale9image1);
}//效果如下:

实例2

void FirstViewController::viewDidLoad()
{
	//创建
	CAScale9ImageView* second9IV = CAScale9ImageView::createWithImage(CAImage::create("source_material/btn_rounded_highlighted.png"));
	//设置非拉伸区域与顶部的距离
	second9IV->setInsetTop(3.0f);
	//设置非拉伸区域与底部的距离
	second9IV->setInsetBottom(3.0f);
	//设置非拉伸区域与右边的距离
	second9IV->setInsetRight(3.0f);
	//设置非拉伸区域与左边的距离
	second9IV->setInsetLeft(3.0f);
	//设置显示区域(拉伸后的大小)
	second9IV->setFrame(CCRect(100, 200, 150, 40));
	//添加渲染
	this->getView()->addSubview(second9IV);

	//创建
	CALabel* image9Label = CALabel::createWithFrame(CCRect(100, 200, 150, 40));
	image9Label->setText(UTF8("使用九图"));
	image9Label->setTextAlignment(CATextAlignmentCenter); //垂直方向对齐
	image9Label->setVerticalTextAlignmet(CAVerticalTextAlignmentCenter);  //竖直方向对齐
	this->getView()->addSubview(image9Label);

	//不使用9宫格拉伸 设置大小与上同
	CAImageView* imageView = CAImageView::createWithFrame(CCRect(400, 300, 150, 40));
	//设置显示图片
	imageView->setImage(CAImage::create("source_material/btn_rounded_highlighted.png"));
	//添加渲染
	this->getView()->addSubview(imageView);

	//创建
	CALabel* imageLabel = CALabel::createWithFrame(CCRect(400, 300, 150, 40));
	imageLabel->setText(UTF8("不用九图"));
	imageLabel->setTextAlignment(CATextAlignmentCenter);  //垂直方向对齐
	imageLabel->setVerticalTextAlignmet(CAVerticalTextAlignmentCenter);  //竖直方向对齐
	this->getView()->addSubview(imageLabel);
}


三. 设置9宫格的9个区域

//设置拉伸区域,方法1
//    cascale9image1->setCapInsets(CCRect(5, 5, caimg->getContentSize().width - 20, caimg->getContentSize().height-20));
    //设置拉伸区域,方法2
    cascale9image1->setInsetTop(5);
    cascale9image1->setInsetBottom(5);
    cascale9image1->setInsetLeft(5);
    cascale9image1->setInsetRight(5);

1. 4个边角不会拉伸,拉伸的是上图中的中间的方形

2. CAScale9IamgeView 类 的拉伸的是像素

3. CAScale9IamgeView 类本身就有一个默认值的拉伸值,如源代码中:

void CAScale9ImageView::setCapInsets(const CCRect& capInsets)
{
    CC_RETURN_IF(m_obCapInsets.equals(capInsets));
    m_obCapInsets = capInsets;
    this->updateCapInset();
}

void CAScale9ImageView::updateCapInset()
{
    float w = m_obOriginalSize.width;
    float h = m_obOriginalSize.height;
    
    if ( m_obCapInsets.equals(CCRectZero) )
    {
        m_obCapInsets = CCRect(w/3, h/3, w/3, h/3);
    }
    
    const float lenghtX1 = m_obCapInsets.origin.x;
    const float lenghtX2 = m_obCapInsets.size.width;
    const float lenghtX3 = w - lenghtX1 - lenghtX2;
    const float lenghtY1 = m_obCapInsets.origin.y;
    const float lenghtY2 = m_obCapInsets.size.height;
    const float lenghtY3 = h - lenghtY1 - lenghtY2;
    
    m_rFrame[0] = CCRect(0, 0, lenghtX1, lenghtY1);
    m_rFrame[1] = CCRect(lenghtX1, 0, lenghtX2, lenghtY1);
    m_rFrame[2] = CCRect(lenghtX1 + lenghtX2, 0, lenghtX3, lenghtY1);
    m_rFrame[3] = CCRect(0, lenghtY1, lenghtX1, lenghtY2);
    m_rFrame[4] = CCRect(lenghtX1, lenghtY1, lenghtX2, lenghtY2);
    m_rFrame[5] = CCRect(lenghtX1 + lenghtX2, lenghtY1, lenghtX3, lenghtY2);
    m_rFrame[6] = CCRect(0, lenghtY1 + lenghtY2, lenghtX1, lenghtY3);
    m_rFrame[7] = CCRect(lenghtX1, lenghtY1 + lenghtY2, lenghtX2, lenghtY3);
    m_rFrame[8] = CCRect(lenghtX1 + lenghtX2, lenghtY1 + lenghtY2, lenghtX3, lenghtY3);
    
    CC_RETURN_IF(m_pobImage == NULL);
    
    if (m_pScale9ImageView)
    {
        for (int i=0; i<9; i++)
        {
            m_pImageView[i]->setImageRect(m_rFrame[i]);
        }
        this->updatePositions();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当一个View超出屏幕时,你可以使用ScrollView或者HorizontalScrollView来解决这个问题。 如果你想拖动一个ImageView,并且希望它不会超出屏幕,你可以使用以下代码: ```java imageView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { // 手指按下时记录位置 lastX = event.getRawX(); lastY = event.getRawY(); break; } case MotionEvent.ACTION_MOVE: { // 移动的距离 float dx = event.getRawX() - lastX; float dy = event.getRawY() - lastY; // 获取imageView的参数 RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) v.getLayoutParams(); // 移动imageView lp.leftMargin += dx; lp.topMargin += dy; // 确定imageView不会超出屏幕 int screenWidth = getResources().getDisplayMetrics().widthPixels; int screenHeight = getResources().getDisplayMetrics().heightPixels; if (lp.leftMargin < 0) { lp.leftMargin = 0; } else if (lp.leftMargin + v.getWidth() > screenWidth) { lp.leftMargin = screenWidth - v.getWidth(); } if (lp.topMargin < 0) { lp.topMargin = 0; } else if (lp.topMargin + v.getHeight() > screenHeight) { lp.topMargin = screenHeight - v.getHeight(); } // 重新设置imageView的参数 v.setLayoutParams(lp); // 更新位置记录 lastX = event.getRawX(); lastY = event.getRawY(); break; } case MotionEvent.ACTION_UP: { // 手指抬起时不需要做任何事情 break; } } return true; } }); ``` 这个代码片段会允许你拖动ImageView,但是它不会被拖动超出屏幕。如果ImageView被拖动到了屏幕边缘,它会停在那里并且无法继续拖动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值