❶ android怎樣將canvas繪制的圖形保存到bitmap中
可以用Bitmap.compress函數來把Bitmap對象保存成PNG或JPG文件,然後可以用BitmapFactory把文件中的數據讀進來再生成Bitmap對象。
保存的代碼大概類似於這樣:
try {
FileOutputStream out = new FileOutputStream(filename);
bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
} catch (Exception e) {
e.printStackTrace();
}
具體的可以去查Bitmap和BitmapFactory的幫助文檔。
❷ Android里怎麼動態設置按照一張圖片高度的百分比列來顯示
ImageView的LayoutParam都設置為wrap_content並設置 android:scaleType="matrix"代碼里創建MatrixMatrix matrix = new Matrix();Matrix matrix = new Matrix();matrix.postScale(0.5f, 1f);//寬縮小到50%,高度不變img.setImageMatrix(matrix);
❸ android Matrix.setRotate 鍜 postRotate鐨勫尯鍒
Matrix涓昏佺敤浜庡瑰鉤闈㈣繘琛屽鉤縐(Translate)錛岀緝鏀(Scale)錛屾棆杞(Rotate)浠ュ強鏂滃垏(Skew)鎿嶄綔銆
涓虹畝鍖栫煩闃靛彉鎹錛孉ndroid灝佽呬簡涓緋誨垪鏂規硶鏉ヨ繘琛岀煩闃靛彉鎹錛涘叾涓鍖呮嫭錛
set緋誨垪鏂規硶錛歴etTranslate錛宻etScale錛宻etRotate錛宻etSkew錛涜劇疆錛屼細瑕嗙洊涔嬪墠鐨勫弬鏁般
pre緋誨垪鏂規硶錛歱reTranslate錛宲reScale錛宲reRotate錛宲reSkew錛涚煩闃靛厛涔橈紝濡侻' = M * T(dx, dy)銆
post緋誨垪鏂規硶錛歱ostTranslate錛宲ostScale錛宲ostRotate錛宲ostSkew錛涚煩闃靛悗涔橈紝濡侻' = T(dx, dy) * M銆
閫氳繃灝嗗彉鎹㈢煩闃典笌鍘熷嬬煩闃電浉涔樻潵杈懼埌鍙樻崲鐨勭洰鐨勶紝渚嬪傦細
騫崇Щ錛坸'=x+tx錛泍'=y+ty錛夛細
緙╂斁錛坸'=sx*x錛泍'=sy*y錛夛細
鏃嬭漿錛坸'=cos尾*x-sin尾*y錛泍'=sin尾*x+cos尾*y錛夛細
閫夋嫨闇瑕佺敤鍒板備笅鐨勪笁瑙掑嚱鏁扮殑鍏寮忥細
鈶爏in(偽+尾)=sin偽cos尾+cos偽sin尾
鈶cos(偽+尾)=cos偽cos尾-sin偽sin尾
鍏寮忊憼鍙浠ョ敱鍗曚綅鍦嗘柟娉曟垨鎵樺嫆瀵嗗畾鐞嗘帹瀵煎嚭鏉ャ
鎺ㄥ艱繃紼嬪弬瑙侊細http://blog.sina.com.cn/s/blog_58260f420100c03j.html
鏂滃垏錛坸'=x+k1*y錛泍'=k2*x+y錛夛細
//婧愮爜鏂囦歡錛歟xternal\skia\legacy\src\core\SkMatrix.cpp
#define SK_Scalar1 (1.0f)
#define kMatrix22Elem SK_Scalar1
typedef float SkScalar;
#define SkScalarMul(a, b) ((float)(a) * (b))
enum {
kMScaleX, kMSkewX, kMTransX,
kMSkewY, kMScaleY, kMTransY,
kMPersp0, kMPersp1, kMPersp2
};
void SkMatrix::reset() {
fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //鍏跺間負1
fMat[kMSkewX] = fMat[kMSkewY] =
fMat[kMTransX] = fMat[kMTransY] =
fMat[kMPersp0] = fMat[kMPersp1] = 0; //鍏跺礆紝鍏ㄤ負0
fMat[kMPersp2] = kMatrix22Elem; //鍏跺間負1
this->setTypeMask(kIdentity_Mask | kRectStaysRect_Mask);
}
void SkMatrix::setTranslate(SkScalar dx, SkScalar dy) {
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] = dx; //浠ユ柊鍊糳x瑕嗙洊鍘熷礆紝鍘熷兼棤鏁堜簡
fMat[kMTransY] = dy;
fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //鍏跺間負1
fMat[kMSkewX] = fMat[kMSkewY] =
fMat[kMPersp0] = fMat[kMPersp1] = 0; //鍏跺礆紝鍏ㄤ負0
fMat[kMPersp2] = kMatrix22Elem; //鍏跺間負1
this->setTypeMask(kTranslate_Mask | kRectStaysRect_Mask);
} else {
this->reset();
}
}
bool SkMatrix::preTranslate(SkScalar dx, SkScalar dy) {
if (this->hasPerspective()) {
SkMatrix m;
m.setTranslate(dx, dy);
return this->preConcat(m); //鐭╅樀鐨勫厛涔樿繍綆
}
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] += SkScalarMul(fMat[kMScaleX], dx) +
SkScalarMul(fMat[kMSkewX], dy); //鍏堜箻錛岄渶瑕佺煩闃佃繍綆楄繃
fMat[kMTransY] += SkScalarMul(fMat[kMSkewY], dx) +
SkScalarMul(fMat[kMScaleY], dy);
this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
return true;
}
bool SkMatrix::postTranslate(SkScalar dx, SkScalar dy) {
if (this->hasPerspective()) {
SkMatrix m;
m.setTranslate(dx, dy);
return this->postConcat(m); //鐭╅樀鐨勫悗涔樿繍綆
}
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] += dx; //鍚庝箻錛岀洿鎺ュ姞鏂板糳x鍗沖彲
fMat[kMTransY] += dy;
this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
return true;
}
bool SkMatrix::preConcat(