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