imageview源码
㈠ 在imageview 不设置src,不会响应事件么
一、ImageView设置background和src的区别。
1.src是图片内容(前景),bg是背景,可以同时使用。
2.background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸 。
3.scaleType只对src起作用;bg可设置透明度。
二、ImageView几种不同的设置图片的方式。
设置background:
1.image.setBackground(getResources().getDrawable(R.drawable.blackk));//变形
2.image.setBackgroundResource(R.drawable.blackk);//变形 3.image.setBackgroundDrawable(getResources().getDrawable(R.drawable.blackk));////变形
源码:这三种方法的实质都是调用方法3setBackgroundDrawable()。
设置src:
1.image.setImageDrawable(getResources().getDrawable(R.drawable.blackk)); //不会变形
2.Stringpath=Environment.getExternalStorageDirectory()+File.separator+”test1.jpg”;
Bitmap bm = BitmapFactory.decodeFile(path);
image.setImageBitmap(bm);//不会变形
3.image.setImageResource(R.drawable.blackk);//不会变形
源码: 其中方法2就是将bitmap转换为drawable然后调用方法1,方法1和方法3都是调用updateDrawable()方法。
㈡ 安卓布局文件中的包引用问题
把你TouchableImageView源码贴出来看看,一般这种错误是在TouchableImageVIew中的构造方法参数不对,
public class MyTextView extends TextView{
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
}
要两个参数,不然就会报这个错误
㈢ 如何使用ImageView 和 Slider两个控件
这篇记录了两个控件的使用流程:ImageView 和 Slide。
ImageView
1、首先,在Cocos Studio创建一个名为"SpriteTest"的项目。然后将需要的资源导入到项目中,我导入三张图片,也就是我们最熟悉的boy,girl,girl_3。(都说三角形是最稳固的,那么三角恋呢?),最后将创建好的项目导出到Cocos2d-x项目的Resources目录下。
2、打开Cocos2d-x工程,添加上面导过来的.json文件,代码如下:
cocos2d::ui::Widget* image_sp = GUIReader::getInstance()->widgetFromJsonFile("SpriteTest_1.json");//读取json配置文件
this->addChild(image_sp,2);
之后运行下程序,恩,三个主角都显示出来,没多大问题。
这里要点名的一点是:在Cocos2d-x中我的模拟器窗口大小为960*640,而Cocos Studio项目中我设置的窗口大小为480*320,这样程序跑起来后会发现image_sp显示的位置处于左下方原点的位置。
3、我觉得image_sp放在左下角太委屈它了,所以我要将它往右上角移动下。代码如下:
image_sp->setPosition(Point(300,200));
恩,运行后果然移动过去了,这样看来Widget也没什么了不起的嘛。我进它源码里看看还有什么。
4、接下来我要单独取出boy来玩玩。可是,怎么取呢?难道也是用Sprite吗?要知道这可是Cocos Studio啊。灵机一动:Menu是用Button代替,那么Sprite应该是用Image代替吧,赶紧敲代码试下,还没敲完我终于反应过来,坑爹啊!
最后还是到Test里看下代码才知道是用ImageView。
ImageView* boy = static_cast<ImageView*>(Helper::seekWidgetByName(image_sp,"boy"));
boy->setPosition(Point(240,200));
恩,跑一下没有问题。
5、下面进ImageView的源码里看看。看完源码,果然,才这么几行,没难度啊!挑几个重点的API看吧。
static ImageView* create();//类似Sprite的create()
static ImageView* create(const std::string& imageFileName, TextureResType texType = UI_TEX_TYPE_LOCAL);//同上
void loadTexture(const std::string& fileName,TextureResType texType = UI_TEX_TYPE_LOCAL);//类似Sprite的initWithFile()。
没啥好说的,换汤不换药。唯一不同的地方就是TextureRestType这货,它应该是值读取纹理的类型,有以下两种:
typedef enum
{
UI_TEX_TYPE_LOCAL = 0,
UI_TEX_TYPE_UI_TEX_TYPE_LOCALPLIST = 1
}TextureResType;
//UI_TEX_TYPE_LOCAL是直接读取资源目录下的图片,这也是创建初始化ImageView的默认方式;
//UI_TEX_TYPE_UI_TEX_TYPE_LOCALPLIST 应该是读取plist文件。
6、最后就是跳过cocostudio,直接用ImageView创建个对象来试试,这里我先用Sprite创建一个对象,看是否可以加载到image_sp上,事实证明是可以的。最后看代码(有三个boy)
ImageView* boy = static_cast<ImageView*>(Helper::seekWidgetByName(image_sp,"boy")); //用image_sp中提取
boy->setPosition(Point(240,200));
auto boy_cx = Sprite::create("boy.png");//用Sprite创建
boy_cx->setPosition(Point(200,100));
image_sp->addChild(boy_cx,2);
auto boy_cc = ImageView::create("boy.png");//用boy_cc创建
boy_cc->setPosition(Point(300,100));
image_sp->addChild(boy_cc,2);
----------------------------------------------------------------------------------------------------------------------------
Slider
接下来开始搞下slider,也就是Cocos2d-x中的ControlSlider。
1、在Cocos Stuido中创建一个工程。然后将slider拖到场景中,在属性设置里我就改了个name,其他都默认。因为用的都是系统自带的那些资源图片,所以在Cocos2d-x中显示的效果非常的不友好。
2、在Cocos2d-x中导入slider的.json文件,然后加载到场景中来。代码如下:
cocos2d::ui::Widget* slideUI = GUIReader::getInstance()->widgetFromJsonFile("SlideUI/SlideUI_1.json");
this->addChild(slideUI,2);
3、单独提取出slide这个控件,然后对它做一些简单的操作,如setPosition。
Slider* slide = static_cast<Slider*>(Helper::seekWidgetByName(slideUI,"slide"));
slide->setPosition(Point(500,200));<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">
其实每篇都有这一步的原因是因为我想了解slider这个控件在Cocos2d-x中的类名叫什么。例如ProgressBar在Cocos2d-x中的类名就叫:
LoadingBar。
4、下面看下Slide的源码:
//创建Slide的方式比较特别,因为它没有一个API是直接在create中加载资源的
static Slider* create();
//有下面几个加载资源的方式:
//a 加载背景条,背景条知道不?就是进度为0时,整个进度条显示的背景图片
void loadBarTexture(const std::string& fileName,TextureResType texType = UI_TEX_TYPE_LOCAL);
//b 加载拖杆,也就是在滑动条上滚来滚去的那个杆子
void loadSlidBallTextures(const std::string& normal,//未被触摸显示的图片
const std::string& pressed,//触摸后显示的图片
const std::string& disabled,//禁止触摸显示的图片
TextureResType texType = UI_TEX_TYPE_LOCAL);
//上面这个API是可以一次性的加载三张图片,下面这三个是单独加载的:
void loadSlidBallTextureNormal(const std::string& normal,TextureResType texType = UI_TEX_TYPE_LOCAL);
void loadSlidBallTexturePressed(const std::string& pressed,TextureResType texType = UI_TEX_TYPE_LOCAL);
void loadSlidBallTextureDisabled(const std::string& disabled,TextureResType texType = UI_TEX_TYPE_LOCAL);
//TextureResType这货在之前的笔记里有提到过,UI_TEX_TYPE_LOCAL 就表示加载的纹理图片是直接从Resources目录下加载,而
//UI_TEX_TYPE_PLIST表示加载的纹理是通过plist来加载。
//c 加载进度条
void loadProgressBarTexture(const std::string& fileName, TextureResType texType = UI_TEX_TYPE_LOCAL);
void setPercent(int percent);//设置进度
int getPercent();//读取进度
void addEventListenerSlider(Ref* target,SEL_SlidPercentChangedEvent selector);//添加事件回调
5、下面简单的创建一个Slider:
auto m_slide = Slider::create();
m_slide->loadBarTexture("SlideUI/sliderTrack.png");
m_slide->loadSlidBallTextures("SlideUI/sliderThumb.png","SlideUI/sliderThumb.png","");
m_slide->loadProgressBarTexture("SlideUI/sliderProgress.png");
m_slide->setPosition(Point(200,200));
m_slide->setPercent(50);
m_slide->addEventListenerSlider(this,sliderpercentchangedselector(HelloWorld::sliderCallback));//添加回调函数
this->addChild(m_slide,3);
//下面看下回调函数的声明:
void sliderCallback(Ref* sender,SliderEventType type);
//进入SliderEventType看下它都有哪些参数:
typedef enum
{
SLIDER_PERCENTCHANGED
}SliderEventType;
//好吧,就一个,那就是每当slide的进度发生变化时都会跳入到回调函数中。
//下面看下回调函数的实现:
void HelloWorld::sliderCallback(Ref* sender,SliderEventType type)
{
switch (type)
{
case SLIDER_PERCENTCHANGED:
CCLOG("slide percent change");
break;
}
}
恩,也就这样吧。
6、小结。
Slider个人感觉还是没有Cocos2d-x原装的ControlSlider好用,API也没多少。毕竟ControlSlider还有设置Slider的最大值,最小值,允许滑动的最大值等。
z转载,仅供参考,祝你愉快,满意请采纳。
㈣ 怎么查看imageview的源码
//定义ImageView(两种方式)ImageView imageView = new ImageView(this); //orImageView imageView = (ImageView)this.findViewById(R.id.xxxx); //or//通过ImageView控件显示图片(三种方式)imageView.setImageBitmap(Bitmap bm); // orimageView.setImageDrawable(Drawable drawable); //orimageView.setImageResource(int resId); //or
㈤ 求解 android 图片点击一下就放大到全屏,再点一下就回到原界面,这个android源码谁有呢
package com.pic;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.ImageView;
public class TestanroidpicActivity extends Activity {
/** Called when the activity is first created. */
Bitmap bp=null;
ImageView imageview;
float scaleWidth;
float scaleHeight;
int h;
boolean num=false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Display display=getWindowManager().getDefaultDisplay();
imageview=(ImageView)findViewById(R.id.imageview);
bp=BitmapFactory.decodeResource(getResources(),R.drawable.icon);
int width=bp.getWidth();
int height=bp.getHeight();
int w=display.getWidth();
int h=display.getHeight();
scaleWidth=((float)w)/width;
scaleHeight=((float)h)/height;
imageview.setImageBitmap(bp);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
if(num==true) {
Matrix matrix=new Matrix();
matrix.postScale(scaleWidth,scaleHeight);
Bitmap newBitmap=Bitmap.createBitmap(bp, 0, 0, bp.getWidth(), bp.getHeight(), matrix, true);
imageview.setImageBitmap(newBitmap);
num=false;
}
else{
Matrix matrix=new Matrix();
matrix.postScale(1.0f,1.0f);
Bitmap newBitmap=Bitmap.createBitmap(bp, 0, 0, bp.getWidth(), bp.getHeight(), matrix, true);
imageview.setImageBitmap(newBitmap);
num=true;
}
break;
}
return super.onTouchEvent(event);
}
}
㈥ 点击一个ImageView让它至于控件的最前面,该如何处理
先谈一下基本的实现原理,这种桌面悬浮窗的效果很类似与Widget,但是它比Widget要灵活的多。主要是通过WindowManager这个类来实现的,调用这个类的addView方法用于添加一个悬浮窗,updateViewLayout方法用于更新悬浮窗的参数,removeView用于移除悬浮窗。其中悬浮窗的参数有必要详细说明一下。
WindowManager.LayoutParams这个类用于提供悬浮窗所需的参数,其中有几个经常会用到的变量:
type值用于确定悬浮窗的类型,一般设为2002,表示在所有应用程序之上,但在状态栏之下。
flags值用于确定悬浮窗的行为,比如说不可聚焦,非模态对话框等等,属性非常多,大家可以查看文档。
gravity值用于确定悬浮窗的对齐方式,一般设为左上角对齐,这样当拖动悬浮窗的时候方便计算坐标。
x值用于确定悬浮窗的位置,如果要横向移动悬浮窗,就需要改变这个值。
y值用于确定悬浮窗的位置,如果要纵向移动悬浮窗,就需要改变这个值。
width值用于指定悬浮窗的宽度。
height值用于指定悬浮窗的高度。
创建悬浮窗这种窗体需要向用户申请权限才可以的,因此还需要在AndroidManifest.xml中加入<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
原理介绍完了,下面我们开始用代码实现。首先在Eclipse中新建一个Android项目,项目名就叫做360FloatWindowDemo。然后写一下布局文件,布局文件非常简单,只有一个按钮,打开或新建activity_main.xml,加入如下代码:
[html] view plain
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context=".MainActivity" >
<Button
android:id="@+id/start_float_window"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start Float Window" >
</Button>
</RelativeLayout>
然后再新建一个名为float_window_small.xml的布局文件,用于做为小悬浮窗的布局,在其中加入如下代码:
[html] view plain
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/small_window_layout"
android:layout_width="60dip"
android:layout_height="25dip"
android:background="@drawable/bg_small"
>
<TextView
android:id="@+id/percent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:textColor="#ffffff"
/>
</LinearLayout>
再新建一个名为float_window_big.xml的布局文件,用于做为大悬浮窗的布局,在其中加入如下代码:
[html] view plain
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/big_window_layout"
android:layout_width="200dip"
android:layout_height="100dip"
android:background="@drawable/bg_big"
android:orientation="vertical"
>
<Button
android:id="@+id/close"
android:layout_width="100dip"
android:layout_height="40dip"
android:layout_gravity="center_horizontal"
android:layout_marginTop="12dip"
android:text="关闭悬浮窗"
/>
<Button
android:id="@+id/back"
android:layout_width="100dip"
android:layout_height="40dip"
android:layout_gravity="center_horizontal"
android:text="返回"
/>
</LinearLayout>
两个悬浮窗布局文件中用到的图片资源,大家可以随便找点图片来代替,同时我会给出源码,大家也可以从源码中取出。
然后打开或创建MainActivity,这是项目的主界面,在里面加入如下代码:
[java] view plain
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startFloatWindow = (Button) findViewById(R.id.start_float_window);
startFloatWindow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(MainActivity.this, FloatWindowService.class);
startService(intent);
finish();
}
});
}
}
这里可以看到,MainActivity的代码非窗简单,就是对开启悬浮窗的按钮注册了一个点击事件,用于打开一个服务,然后关闭当前Activity。创建悬浮窗的逻辑都交给服务去做了。
㈦ android: ImageView的setImageBitmap()方法
一、ImageView的setImageBitmap()是设置imageView组件的图片显示。它的定义和源码如下:
1、在源代码中输入:if this is used frequently,may handle bitmaps explicitly // to rece the intermedite drawable abject;
2、它实际上是对setImageDrawable接口的封装,支持直接略过Bitmap对象进行组件图片的设置。需要指出的是这个方法设置图片时,进行大图片的处理时,注意对图片的缩放,否则会内存溢出。
(7)imageview源码扩展阅读:
一、Bitmap设置代码:
1、ImageView的setImageBitmap()是设置imageView组件的图片显示,实际上是setImageDrawable接口的封装,支持直接略过Bitmap对象进行组件图片的设置。
2、需要指出的是这个方法设置图片时,进行大图片的处理时,注意对图片的缩放,否则会内存溢出。if this is used frequently,may handle bitmaps explicitly // to rece the intermedite drawable abject;
二、根据位深度,可将位图分为1、4、8、16、24及32位图像等。每个像素使用的信息位数越多,可用的颜色就越多,颜色表现就越逼真,相应的数据量越大。例如,位深度为 1 的像素位图只有两个可能的值(黑色和白色)。
1、所以又称为二值位图。位深度为 8 的图像有 2^8(即 256)个可能的值。位深度为 8 的灰度模式图像有 256 个可能的灰色值。
2、RGB图像由三个颜色通道组成。8 位/通道的 RGB 图像中的每个通道有 256 个可能的值,这意味着该图像有 1600 万个以上可能的颜色值。
3、有时将带有 8 位/通道 (bpc) 的 RGB 图像称作 24 位图像(8 位 x 3 通道 = 24 位数据/像素)。通常将使用24位RGB组合数据位表示的的位图称为真彩色位图。
4、BMP文件是微软公司所开发的一种交换和存储数据的方法,各个版本的Windows都支持BMP格式的文件。Windows提供了快速、方便的存储和压缩BMP文件的方法。BMP格式的缺点是,要占用较大的存储空间,文件尺寸太大。
㈧ ImageView设置background和src的区别
今天开发的时候遇到一个小问题,在给一个ImageView更换图片的时候,我使用的是java的方式更换,使用的方法是setBackgroundResource(),但奇怪的是总是没有效果。
最后查明原因是:我在编写xml文件的时候,为了查看效果,给这个ImageView设置了src,这时候再设置background的时候回发生重叠。
解决方法:将xml中的src删除即可。
问题延伸:
一、ImageView设置background和src的区别。
1.src是图片内容(前景),bg是背景,可以同时使用。
2.background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸 。
3.scaleType只对src起作用;bg可设置透明度。
二、ImageView几种不同的设置图片的方式。
设置background:
1.image.setBackground(getResources().getDrawable(R.drawable.blackk));//变形
2.image.setBackgroundResource(R.drawable.blackk);//变形 3.image.setBackgroundDrawable(getResources().getDrawable(R.drawable.blackk));////变形
源码:这三种方法的实质都是调用方法3setBackgroundDrawable()。
设置src:
1.image.setImageDrawable(getResources().getDrawable(R.drawable.blackk)); //不会变形
2.Stringpath=Environment.getExternalStorageDirectory()+File.separator+”test1.jpg”;
Bitmap bm = BitmapFactory.decodeFile(path);
image.setImageBitmap(bm);//不会变形
3.image.setImageResource(R.drawable.blackk);//不会变形
源码: 其中方法2就是将bitmap转换为drawable然后调用方法1,方法1和方法3都是调用updateDrawable()方法。
㈨ android图片编辑源码 实现拍照与裁剪功能就行
我有拍照的程序代码,然后拍完照把照片放在一个imageview里面显示在界面上,不知是否符合你要求?要的话可以发你
㈩ android 开发中 如何把读取到的图片放到listitem的imageview中,求大侠告诉,有源码最好了。。有高分哦!
你在ListView的Adapter中的getView方法中就可以读取图片并且设置到imageView中。但是这样会有效率问题,你可以开一个线程,通过这个线程来加载图片,加载完了就通过Handler来更新ListView