我想创建一个类似下图的形状:

注意从颜色1到颜色2的上半部分渐变,但是从颜色3到颜色4渐变的下半部分.我知道如何使用单个渐变制作形状,但我不确定如何将形状分割成两半,并制作1个形状,2个不同的渐变.
有任何想法吗?
我试图得到的高度和宽度ImageView的Fragment有以下ViewTreeObserver:
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
private ImageView imageViewPicture;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_general_activity_add_recipe, container, false);
setHasOptionsMenu(true);
...
final ViewTreeObserver observer = imageViewPicture.getViewTreeObserver();
observer.addOnGlobalLayoutListener (new OnGlobalLayoutListener () {
@Override public void onGlobalLayout() {
observer.removeGlobalOnLayoutListener(this);
}
});
return view;
}
Run Code Online (Sandbox Code Playgroud)
运行此代码会导致以下异常:
10-12 23:45:26.145: E/AndroidRuntime(12592): FATAL EXCEPTION: main
10-12 23:45:26.145: E/AndroidRuntime(12592): java.lang.IllegalStateException: This ViewTreeObserver is not alive, call getViewTreeObserver() again
10-12 23:45:26.145: E/AndroidRuntime(12592): at android.view.ViewTreeObserver.checkIsAlive(ViewTreeObserver.java:509)
10-12 23:45:26.145: E/AndroidRuntime(12592): …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,它在一堆图像上绘制线条.为了选择这些图像,我有一个广播组,每当用户点击一个单选按钮时,图像就会加载所有图纸.
在我的收音机听众中,我有以下代码:
bitmap = BitmapUtils.decodeSampledBitmapFromResource(root + DefinesAndroid.CAMINHO_SHOPPINGS_SDCARD + nomeImagemAtual, size.x, size.y);
mImage.setImageBitmap(bitmap);
mImage.setDrawLines(true);
mImage.setImageBitmap(loadBitmapFromView(mImage));
Run Code Online (Sandbox Code Playgroud)
decodeSampledBitmapFromResource我从Android开发人员的这个链接获得的方法(它更有效地加载位图)http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
这是我调用以获取视图位图的方法
public static Bitmap loadBitmapFromView(View v) {
Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}
Run Code Online (Sandbox Code Playgroud)
我正在设置图像Bitmap,mImage因为我正在使用ImageViewTouch库(它可以在ImageView上进行缩放缩放),如果我不这样做,所有画布绘图都会被删除,图像上的任何交互都会被删除(比如放大/出).
错误日志如下
07-11 21:13:41.567: E/AndroidRuntime(20056): java.lang.IllegalArgumentException: width and height must be > 0
07-11 21:13:41.567: E/AndroidRuntime(20056): at android.graphics.Bitmap.createBitmap(Bitmap.java:638)
07-11 21:13:41.567: E/AndroidRuntime(20056): at android.graphics.Bitmap.createBitmap(Bitmap.java:620)
Run Code Online (Sandbox Code Playgroud)
我几乎可以肯定这个错误正在发生,因为当我调用getBitmapFromView方法时图像位图没有完全加载.
如何知道视图何时完全加载?
我一直在寻找一种方法来以编程方式更改android中溢出菜单图标的颜色.
我找到的唯一选择是通过添加自定义样式永久更改图标.问题是,在不久的将来,我们需要在使用我们的应用程序时更改此设置.
我们的应用程序是一系列在线平台的扩展,因此用户可以进入其平台的web-url.它们有自己的样式,并将通过API调用来获取应用程序.
这些可能会让我改变图标的颜色......
目前我更改了Actionbar中的其他图标,如下所示:
if (ib != null){
Drawable resIcon = getResources().getDrawable(R.drawable.navigation_refresh);
resIcon.mutate().setColorFilter(StyleClass.getColor("color_navigation_icon_overlay"), PorterDuff.Mode.SRC_ATOP);
ib.setIcon(resIcon);
}
Run Code Online (Sandbox Code Playgroud)
现在我将不得不使用这些风格.
这不是Android开发者控制台中神秘堆栈跟踪的重复(位图大小超过32位)
这个问题没有提供单行代码,也没有答案; 此外,即使我将位图大小设置为32x32,我也会收到此错误,它是唯一的Bitmap,因此它与内存无关.
我想做的事
所述Log.e用于ImageView的大小,因此位图输出为:
Width: 272
Height: 136
Run Code Online (Sandbox Code Playgroud)
怎么了
以下代码适用于Nexus4,Nexus7和Desire HD(CM10),但在模拟器上运行应用程序会给出如下所示的错误(API 8).
发现
我尝试过它的一半大小和32x32,这给出了同样的错误.
我在DialogFragment中显示ImageView(针对API 8的ActionBarSherlock/HoloEveryWhere),也许这就是罪魁祸首?
ImageView的:
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="12dp"
android:layout_marginTop="12dp" />
Run Code Online (Sandbox Code Playgroud)
在我的活动中:
iv = (ImageView) view.findViewById(R.id.imageView1);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (!waveFormMeasured) {
if (iv.getMeasuredWidth() > 1) {
width = iv.getMeasuredWidth();
Log.e(TAG, "Width: " + width + " Height: " + width / 2);
waveBitmap = Bitmap.createBitmap((int) width, …Run Code Online (Sandbox Code Playgroud) 我已经尝试到了什么:
呼唤 measure()
tv.measure(0, 0);
int height = tv.getMeasuredHeight();
Run Code Online (Sandbox Code Playgroud)measure()以指定的尺寸/模式进行呼叫
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(99999, View.MeasureSpec.AT_MOST);
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
tv.measure(widthMeasureSpec, heightMeasureSpec);
int height = tv.getMeasuredHeight();
Run Code Online (Sandbox Code Playgroud)呼唤 getTextBounds()
Rect bounds = new Rect();
tv.getPaint().getTextBounds(tv.getText().toString(), 0, tv.getText().length(), bounds);
int height = bounds.height();
Run Code Online (Sandbox Code Playgroud)先打电话measure()再打电话getTextBounds()
getLineCount() * getLineHeight()似乎没有任何工作。它们都返回不正确的值(容器视图的高度不正确-太小或太大)
关于如何计算这个简单事情的想法?
我们在从特定视图生成位图时遇到问题.限制是它无法呈现视图(绘图).有没有人有任何提示如何解决这个问题?
类视图的文档(http://developer.android.com/reference/android/view/View.html)对Android用于呈现View的步骤有一些解释.在这种情况下,我们将进入"布局",而不是"绘图".谁有任何想法,可以展示一个例子?
我的代码生成异常:错误 - >宽度和高度必须> 0
...
public static Bitmap loadBitmapFromView(View v) {
Bitmap b = null;
try {
b = Bitmap.createBitmap(
v.getWidth(),
v.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.measure(v.getWidth(), v.getHeight());
v.layout(0, 0, v.getWidth(), v.getHeight());
v.draw(c);
} catch (Exception e) {
Log.e(MainActivity.TAG, "error -> "+e.getMessage());
}
return b;
}
public void snap(View v) {
LayoutInflater inflate = (LayoutInflater) getBaseContext()
.getSystemService(LAYOUT_INFLATER_SERVICE);
View view = new View(getBaseContext());
view = inflate.inflate(R.layout.list_item, null);
Log.d(MainActivity.TAG, "getWidth -> "+view.getWidth());
Log.d(MainActivity.TAG, "getHeight -> "+view.getHeight()); …Run Code Online (Sandbox Code Playgroud)