From b94183bf7cbce34ddd52a0e28f134000c23c54ad Mon Sep 17 00:00:00 2001 From: Mike Reed Date: Fri, 5 Jun 2009 15:56:23 -0400 Subject: [PATCH] add sample for using colorfilters --- samples/ApiDemos/AndroidManifest.xml | 7 + .../ApiDemos/res/drawable/btn_check_off.png | Bin 0 -> 1172 bytes .../ApiDemos/res/drawable/btn_check_on.png | Bin 0 -> 1390 bytes .../res/drawable/btn_circle_normal.png | Bin 0 -> 1249 bytes .../res/drawable/btn_default_normal.9.png | Bin 0 -> 763 bytes .../android/apis/graphics/ColorFilters.java | 184 ++++++++++++++++++ 6 files changed, 191 insertions(+) create mode 100644 samples/ApiDemos/res/drawable/btn_check_off.png create mode 100644 samples/ApiDemos/res/drawable/btn_check_on.png create mode 100644 samples/ApiDemos/res/drawable/btn_circle_normal.png create mode 100644 samples/ApiDemos/res/drawable/btn_default_normal.9.png create mode 100644 samples/ApiDemos/src/com/example/android/apis/graphics/ColorFilters.java diff --git a/samples/ApiDemos/AndroidManifest.xml b/samples/ApiDemos/AndroidManifest.xml index fb34afa9f..9d255128d 100644 --- a/samples/ApiDemos/AndroidManifest.xml +++ b/samples/ApiDemos/AndroidManifest.xml @@ -1562,6 +1562,13 @@ + + + + + + + diff --git a/samples/ApiDemos/res/drawable/btn_check_off.png b/samples/ApiDemos/res/drawable/btn_check_off.png new file mode 100644 index 0000000000000000000000000000000000000000..56d3861542ea408e871b7003c38e36dd3b7fae61 GIT binary patch literal 1172 zcmV;F1Z(?=P)4?{h0xm^4;NERgvk@+0- zpCv1h?cqS}5JsJg<75vO78YKQjg8$81Oo9^w-g9)adA;zT3Sj^O-;R{QyH?K*RD~W z(u6R5JkDmbZzGXNlFvKQ>o_{w+uJ`TCMMp{*DvH}r%{fj(&_Z8a5$W-R4RBXY53l1 zHe8Zgd*R)d|Np9`u&aeRC%hK7bjDwR^(lQkIUmmMgpYuItQTo#Lqi=w-`TTr!& z{r!D$baW(-aZU9;reGeZ#bB*cY;A2#^!4>gD1@z}qvPtqVATikn1Q)Dls8q4)mmO& zme(MB7zibP1L*1Lsr;>)V{TK$xWCi`YgWOPl@&P$N*RVBK~7Fi&>qCu*_jNn5=xIP zu$vZu4h4|I!$T2^#pHP?#}(N$m!KMKYNb!^6XMp;lK{k5prG zb5lCTcNL12!hD1fxivmME`bnEy>gLbRXFQDrh|FCUU^eM;YJLX&*!B>gqoqyqj>j# zIU^$@@;8J~FC=v#*A;V{DaM9`#{dKu2jCDgsDk`KVlxzS2p|B(ZwChlmfI&w#ni5^ zZheBmpxD~llE>V+;S|P$RmKD0JRS&8fN!vcw_lZdC{_8P3g8ghY9-YSY%-oC>D!X`KIq6&>FCF01(tNeMPIzx3g9nR$vGtppZkTR(@(+3x(qG zxI8YEO14*xf38a10f3M<06{MC5`$3V7*M%*>F_=INjCz6QZLA!&d$z0nw*>r(2nzt6JXSgEA#X7zh-7;zS5~r zWFN>+sSy}Hu#b5{_K++=7IE;M_Z!)Fvd?5Y*I4R+$u@;|i126JZo6<`32PmrtaJg(&c0000y|KhA;$pIESQkXlUpQo6S~|o}Qi)?Ucd> z*xA|fj*gBxs;a8Kq+7p}ygKlVS}9G)q{F$Xsj054tgL+Hek^jGvO9BgbAROJ71jz| zvtLuEr_f-Ee}w}T>KR3`%j3euZ!TiYGzL(tk1UPA{>l!)B8bn(>u7@M*;)!%v@F)) z=)hP8K^4h)zzBG@J$pLj7tm{g>6EQJs?`*0UGKY&N4iIVl`axV767}~j`I9+Y;JCf z^JO2?Xnm7ur{ zaB)}y_p2Bi$Cw{r5YNi+^O!kI*kz$9?H_%<$lcp)HE+dv!o zlKLbluDmM}SmRD3YJ?gQYI}Qo&kq?;uh)l;%0OU^69iRCP&Tf*WRdAs_eA)Sf z(f3^ko*SR3Eyu% z*h}r=^{v5M=uht7hhqK9lpz+1(Dgx=2&DLx8jO8Rh6|m?{K2j!UPZU3TMBp6K3v<& zHn@LwV`6y%{U#OEw&YXn?00hRAUP=+D=RC90!dxS-^gP1h4q*opT;x#i8E4UI9lrN z;$0%3^DG&P$EpO@d8!iy<^mB)X$&;L3|c+EUY+$7VaR5o8HEdlVuBQX=NJk11n-j+ z%U}sI6m8*^wJWGDs1~6(U-`eVzxZ2Br)4p9L&wr%>49n9Bsw(KWH=M;?>i@?mDZ&s zdUo+Fnm=mZb9SvYRXJ1JVp?( zfkkF9f3aoQ(4cD&eFz>IZd1xv4BTVx5uM%bc1P4|zfn~BM^jBs4d(uw!$aLeX@woh z*>4=bf&A=z5h{?g`#Zf-_5wwvE?5T}%2_YvUP9%3CGd~rSC?IvQCC#A=j?&zsDmkh z0kkcqwo<49-fnHj@ath13Pg(1wX7JuFfstbQYD_l`tBOqNO5*(n_%Y zTe;+PI^BK~LJkHx3KZ*<93r^IUXG8CFPhEfRJC))>PwvKBzG39lXYwTMNmtJ&w6`% zKgrF_JsIuZKhS5}%*@PkeSQ54y8MdtID&z(r9LI8?(FQWC@U*Vw^%HuSb$MawmUE| zFx%47GD5e$C;6K6xPyT~F2x^{oPqQSkrl&l-k(T*CHaA5{s2n=Fdl5VcjeFa<1qyL wTl#Ji>j;8^#sBJzgT=w(U~#bMjsFA~0JuKz9zxDmrvLx|07*qoM6N<$g1hRMQ2+n{ literal 0 HcmV?d00001 diff --git a/samples/ApiDemos/res/drawable/btn_circle_normal.png b/samples/ApiDemos/res/drawable/btn_circle_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5af1c9fc508aa63af280b7c68926db9c0f07be GIT binary patch literal 1249 zcmV<71Rnc|P)R;sZopj1nGv5j7+lgpe3yMT#IF z#!?rgK-VqHZlTJD=a_rVFwV@*E<@wPPI59ccV_N6bMEKwmv(%7Z2LbRX(?eTVJTs} zNlP>PoeOvp$Of_iC*Tmz9s)5S0^A2eK-5g7C$uCeEEhNr6buXuTrVvxea7qc7G`B- z|T*w|Pr1U>I`I-fG* zLM#@$2Z2A-*Vp&s_7`A9&%s26YbaHxndZMwh@dMn> z0UM_g_B2p6H8s^yTwGjfMoc`BD=RC3nwpv(TuuYOB_pf=s0{=H?-UgkT~@xAs5oW4 zyk1>hov*B{d>^-yqW_r|#*y~Q3N5{x1 zHVV4J>~bVNDq#u^yOFSi-QC>>E|<&wD4J6C*=RKSfZRsH_Cldh1Vi{AVaj>T>dw!4 z*o-`rliWr#{~y6%FsyV+>6~m{HPmaP-aG16kk{lSw~?^l=jZ1`T4Y*_x89;|RIc?C zp`^`H6a{p)Mx#|a6%L2@5Swmwc6NS` z;#ilQtkg%{+sxu`lB`hT@CCs|xZvh4Xd{=#v_6N+a00000 LNkvXXu0mjfjPhEW literal 0 HcmV?d00001 diff --git a/samples/ApiDemos/res/drawable/btn_default_normal.9.png b/samples/ApiDemos/res/drawable/btn_default_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a2d5ccd20c59189a67fb7c1990aff851bdb3b68b GIT binary patch literal 763 zcmVJNRCwCNn9qxnK^VtOAv#pC9w%eWT50ljF81ieR>hST-62<6IU^kH44D=QeZz-GOd-#=C;fpdZk= zt3w>90v+}H{TJ10^+BOfxR*p(EEeA;lga01v-ujAU!d##Y z5*kFGoF;_OAQ24W76bvPFTpYg83n-u>CpLL8lb!h21$F-%&NS%9<5fZR5@aKM36Kd z8KINx9Hk81HRi~1bjk+gIG+h~>*j(uE5ko|l=(KHC${R(2Zb)IRN7pSu#Z&Sb3<^B z>|zL6>+}t&Nz2>#>|(Hix&X}cf&xmGN4^}HVDg0eay$}gs?O>!GAnPZKfk==LS-*I zX+S~`=<~?+A18FeTuyXFg`858=8^09NG7bxAuG2tbRy0p>r}%%Knly_$OSr^&1Op} z<#tY(G6&OJw<)qATlL`V&CzH$99~o^mArXCi7N^dOdztQF+v`ekD+JXZue=uUf&Pd zleBlE(de?(YQ4ixZ=m;PWx7E0Sa2x}e8jVJwTrS_VOWMrebUOVt7z`HecKahP zd(c~G=>t(KL64yZRE6$(YT*=`Km+IlH2>?y5?;~d)mxK&=!OUM8@g0Quyjr8oxKYZ txgE8=q;>0mww-yz2GPlu#I^e)zyJ>_d2K=6FmM0>002ovPDHLkV1h3&WZ(b* literal 0 HcmV?d00001 diff --git a/samples/ApiDemos/src/com/example/android/apis/graphics/ColorFilters.java b/samples/ApiDemos/src/com/example/android/apis/graphics/ColorFilters.java new file mode 100644 index 000000000..92d18ba4a --- /dev/null +++ b/samples/ApiDemos/src/com/example/android/apis/graphics/ColorFilters.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.apis.graphics; + +import com.example.android.apis.R; + +import android.app.Activity; +import android.content.Context; +import android.graphics.*; +import android.graphics.drawable.*; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.*; + +public class ColorFilters extends GraphicsActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(new SampleView(this)); + + } + + private static class SampleView extends View { + private Activity mActivity; + private Drawable mDrawable; + private Drawable[] mDrawables; + private Paint mPaint; + private Paint mPaint2; + private float mPaintTextOffset; + private int[] mColors; + private PorterDuff.Mode[] mModes; + private int mModeIndex; + + private static void addToTheRight(Drawable curr, Drawable prev) { + Rect r = prev.getBounds(); + int x = r.right + 12; + int center = (r.top + r.bottom) >> 1; + int h = curr.getIntrinsicHeight(); + int y = center - (h >> 1); + + curr.setBounds(x, y, x + curr.getIntrinsicWidth(), y + h); + } + + public SampleView(Activity activity) { + super(activity); + mActivity = activity; + Context context = activity; + setFocusable(true); + + mDrawable = context.getResources().getDrawable(R.drawable.btn_default_normal); + mDrawable.setBounds(0, 0, 150, 48); + mDrawable.setDither(true); + + int[] resIDs = new int[] { + R.drawable.btn_circle_normal, + R.drawable.btn_check_off, + R.drawable.btn_check_on + }; + mDrawables = new Drawable[resIDs.length]; + Drawable prev = mDrawable; + for (int i = 0; i < resIDs.length; i++) { + mDrawables[i] = context.getResources().getDrawable(resIDs[i]); + mDrawables[i].setDither(true); + addToTheRight(mDrawables[i], prev); + prev = mDrawables[i]; + } + + mPaint = new Paint(); + mPaint.setAntiAlias(true); + mPaint.setTextSize(16); + mPaint.setTextAlign(Paint.Align.CENTER); + + mPaint2 = new Paint(mPaint); + mPaint2.setAlpha(64); + + Paint.FontMetrics fm = mPaint.getFontMetrics(); + mPaintTextOffset = (fm.descent + fm.ascent) * 0.5f; + + mColors = new int[] { + 0, + 0xCC0000FF, + 0x880000FF, + 0x440000FF, + 0xFFCCCCFF, + 0xFF8888FF, + 0xFF4444FF, + }; + + mModes = new PorterDuff.Mode[] { + PorterDuff.Mode.SRC_ATOP, + PorterDuff.Mode.MULTIPLY, + }; + mModeIndex = 0; + + updateTitle(); + } + + private void swapPaintColors() { + if (mPaint.getColor() == 0xFF000000) { + mPaint.setColor(0xFFFFFFFF); + mPaint2.setColor(0xFF000000); + } else { + mPaint.setColor(0xFF000000); + mPaint2.setColor(0xFFFFFFFF); + } + mPaint2.setAlpha(64); + } + + private void updateTitle() { + mActivity.setTitle(mModes[mModeIndex].toString()); + } + + private void drawSample(Canvas canvas, ColorFilter filter) { + Rect r = mDrawable.getBounds(); + float x = (r.left + r.right) * 0.5f; + float y = (r.top + r.bottom) * 0.5f - mPaintTextOffset; + + mDrawable.setColorFilter(filter); + mDrawable.draw(canvas); + canvas.drawText("Label", x+1, y+1, mPaint2); + canvas.drawText("Label", x, y, mPaint); + + for (Drawable dr : mDrawables) { + dr.setColorFilter(filter); + dr.draw(canvas); + } + } + + @Override protected void onDraw(Canvas canvas) { + canvas.drawColor(0xFFCCCCCC); + + canvas.translate(8, 12); + for (int color : mColors) { + ColorFilter filter; + if (color == 0) { + filter = null; + } else { + filter = new PorterDuffColorFilter(color, + mModes[mModeIndex]); + } + drawSample(canvas, filter); + canvas.translate(0, 55); + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + float x = event.getX(); + float y = event.getY(); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + break; + case MotionEvent.ACTION_MOVE: + break; + case MotionEvent.ACTION_UP: + // update mode every other time we change paint colors + if (mPaint.getColor() == 0xFFFFFFFF) { + mModeIndex = (mModeIndex + 1) % mModes.length; + updateTitle(); + } + swapPaintColors(); + invalidate(); + break; + } + return true; + } + } +} +